记录下自己学习用的demo , 具体分析后续补上。
package lah.surfaceviewdemo;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.content.Context;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Rect;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.TimedMetaData;
import android.media.TimedText;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.LinearLayout;
import java.io.IOException;
public class MainActivity extends Activity implements View.OnClickListener {
private Context mContext;
private LinearLayout mLinearLayout;
private Button bt_play, bt_pause, btn_mute, btn_unmute, btn_notify, btn_size;
private SurfaceView mSurfaceView;
private SurfaceHolder mHolder;
private MediaPlayer mPlayer;
private int windowWidth;
private int windowHeight;
private int videoWith;
private int videoHeight;
private int notification_id = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = this;
//获取屏幕宽高
WindowManager windowManager = this.getWindowManager();
windowWidth = windowManager.getDefaultDisplay().getWidth();
windowHeight = windowManager.getDefaultDisplay().getHeight();
//获取屏幕宽高
DisplayMetrics dm = getResources().getDisplayMetrics();
Log.d("luoanhao", "[MainActivity.java] -- onCreate -- windowWidth:" + windowWidth);
Log.d("luoanhao", "[MainActivity.java] -- onCreate -- windowHeight:" + windowHeight);
Log.d("luoanhao", "[MainActivity.java] -- onCreate -- dm.heightPixels:" + dm.heightPixels);
Log.d("luoanhao", "[MainActivity.java] -- onCreate -- dm.widthPixels:" + dm.widthPixels);
initView();
initPlayer();
}
private void initView() {
mLinearLayout = (LinearLayout) findViewById(R.id.linearlayout_control);
bt_play = (Button) findViewById(R.id.btn_play);
bt_play.setOnClickListener(this);
bt_pause = (Button) findViewById(R.id.btn_pause);
bt_pause.setOnClickListener(this);
btn_mute = (Button) findViewById(R.id.btn_mute);
btn_mute.setOnClickListener(this);
btn_unmute = (Button) findViewById(R.id.btn_unmute);
btn_unmute.setOnClickListener(this);
btn_notify = (Button) findViewById(R.id.btn_notify);
btn_notify.setOnClickListener(this);
btn_size = findViewById(R.id.btn_change_size);
btn_size.setOnClickListener(this);
mSurfaceView = (SurfaceView) findViewById(R.id.surfaceview);
mHolder = mSurfaceView.getHolder();
mHolder.addCallback(new LahCallBack());
}
private void initPlayer() {
mPlayer = new MediaPlayer();
try {
String uri = "android.resource://" + getPackageName() + "/" + R.raw.picture_setting_video;
//String uri = "android.resource://" + getPackageName() + "/" + R.raw.video_test;
//String uri = "https://waptest.chaojijiuxing.cn/ad?id=null";
mPlayer.setDataSource(this, Uri.parse(uri));
// File file = new File("mnt/usb/sda1/aaa_video/DCs.Legends.of.Tomorrow.arabic-ANSI.mkv");
// if (file != null && file.exists()) {
// mPlayer.setDataSource(file.toString());
// }
mPlayer.prepareAsync();
videoWith = mPlayer.getVideoWidth();
videoHeight = mPlayer.getVideoWidth();
Log.d("luoanhao", "[MainActivity.java] -- initPlayer -- videoWith:" + videoWith);
Log.d("luoanhao", "[MainActivity.java] -- initPlayer -- videoHeight:" + videoHeight);
mPlayer.start();
} catch (IOException e) {
e.printStackTrace();
}
mPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() {
@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
Log.d("luoanhao", "[MainActivity.java] -- onBufferingUpdate -- ");
}
});
mPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mPlayer.start();
testTract();
Log.d("luoanhao", "[MainActivity.java] -- onPrepared -- mPlayer.start()");
}
});
mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
Log.d("luoanhao", "[MainActivity.java] -- onCompletion -- ");
//mPlayer.start();
//mPlayer.setLooping(true);
}
});
mPlayer.setOnInfoListener(new MediaPlayer.OnInfoListener() {
@Override
public boolean onInfo(MediaPlayer mp, int what, int extra) {
Log.d("luoanhao", "[MainActivity.java] -- onInfo -- what:" + what);
Log.d("luoanhao", "[MainActivity.java] -- onInfo -- extra:" + extra);
if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START) {
mSurfaceView.setBackgroundColor(Color.TRANSPARENT);
}
return false;
}
});
mPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
Log.d("luoanhao", "[MainActivity.java] -- onError -- what:" + what);
Log.d("luoanhao", "[MainActivity.java] -- onError -- extra:" + extra);
return false;
}
});
mPlayer.setOnVideoSizeChangedListener(new MediaPlayer.OnVideoSizeChangedListener() {
@Override
public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
Log.d("luoanhao", "[MainActivity.java] -- onVideoSizeChanged -- width" + width);
Log.d("luoanhao", "[MainActivity.java] -- onVideoSizeChanged -- height" + height);
}
});
mPlayer.setOnTimedTextListener(new MediaPlayer.OnTimedTextListener() {
@Override
public void onTimedText(MediaPlayer mp, TimedText text) {
if (text != null) {
Log.d("luoanhao", "[MainActivity.java] -- onTimedText -- text.getText():" + text.getText());
}
}
});
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {
mPlayer.setOnTimedMetaDataAvailableListener(new MediaPlayer.OnTimedMetaDataAvailableListener() {
@Override
public void onTimedMetaDataAvailable(MediaPlayer mp, TimedMetaData data) {
Log.d("luoanhao", "[MainActivity.java] -- onTimedMetaDataAvailable -- ");
}
});
}
}
private void testTract() {
if (mPlayer != null) {
MediaPlayer.TrackInfo[] trackInfo = mPlayer.getTrackInfo();
if (trackInfo != null && trackInfo.length > 0) {
for (int i = 0; i < trackInfo.length; i++) {
MediaPlayer.TrackInfo info = trackInfo[i];
if (info.getTrackType() == MediaPlayer.TrackInfo.MEDIA_TRACK_TYPE_TIMEDTEXT) {
mPlayer.selectTrack(i);
}
}
}
}
}
@Override
protected void onPause() {
super.onPause();
}
@Override
protected void onStop() {
if (mPlayer != null) {
mPlayer.release();
mPlayer = null;
}
super.onStop();
}
@Override
protected void onDestroy() {
super.onDestroy();
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_play:
mPlayer.start();
break;
case R.id.btn_pause:
mPlayer.pause();
break;
case R.id.btn_mute:
setMuteEnabled(true);
break;
case R.id.btn_unmute:
setMuteEnabled(false);
break;
case R.id.btn_notify:
showNotification();
break;
case R.id.btn_change_size:
mSurfaceView.getHolder().setFixedSize(windowWidth,windowWidth*9/16);
break;
default:
break;
}
}
private class LahCallBack implements SurfaceHolder.Callback {
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
Log.d("luoanhao", "[MainActivity.java] -- LahCallBack -- surfaceCreated -- ");
mPlayer.setDisplay(surfaceHolder);
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) {
Log.d("luoanhao", "[MainActivity.java] -- surfaceChanged -- format:" + format);
Log.d("luoanhao", "[MainActivity.java] -- surfaceChanged -- width:" + width);
Log.d("luoanhao", "[MainActivity.java] -- surfaceChanged -- height:" + height);
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
}
}
private void setMuteEnabled(boolean enabled) {
AudioManager mAudioManager = (AudioManager) getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
mAudioManager.setStreamMute(AudioManager.STREAM_MUSIC, enabled);
} else {
if (enabled) {
mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_MUTE, AudioManager.FLAG_SHOW_UI);
} else {
mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_UNMUTE, AudioManager.FLAG_SHOW_UI);
}
}
}
private void showNotification() {
NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(mContext);
//设置标题
mBuilder.setContentTitle("我是标题")
//设置内容
.setContentText("我是内容")
//设置大图标
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
//设置小图标
.setSmallIcon(R.mipmap.ic_launcher_round)
//设置通知时间
.setWhen(System.currentTimeMillis())
//首次进入时显示效果
.setTicker("我是测试内容")
//设置优先级
.setPriority(Notification.PRIORITY_HIGH)
//设置通知方式,声音,震动,呼吸灯等效果,这里通知方式为声音
.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_LIGHTS);
//发送通知请求
notificationManager.notify(notification_id++, mBuilder.build());
}
}
xml 布局,
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:context="lah.surfaceviewdemo.MainActivity">
<SurfaceView
android:id="@+id/surfaceview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<SeekBar
android:layout_width="match_parent"
android:layout_height="2dp"/>
<LinearLayout
android:id="@+id/linearlayout_control"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/btn_play"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/btn_pause"
android:layout_centerHorizontal="true"
android:background="@drawable/sel_btn"
android:text="@string/play"/>
<Button
android:id="@+id/btn_pause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:background="@drawable/sel_btn"
android:text="@string/pause"/>
<Button
android:id="@+id/btn_change_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:background="@drawable/sel_btn"
android:text="@string/size"/>
<Button
android:id="@+id/btn_mute"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:background="@drawable/sel_btn"
android:text="@string/mute"/>
<Button
android:id="@+id/btn_unmute"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:background="@drawable/sel_btn"
android:text="@string/unmute"/>
<Button
android:id="@+id/btn_notify"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:background="@drawable/sel_btn"
android:text="@string/notify"/>
</LinearLayout>
</LinearLayout>
</FrameLayout>