描述Android系統在視頻播放時來電話的解決方案
1.當來電後返回後,只有聲音,沒有畫面時,是因爲當前activity對象被遮擋後,SurfaceView對象被銷燬,而activity重新顯示時他的重建晚於onResume()方法的執行。
此時應解決SurfaceView的重建問題:
private final class SurfaceCallback implements Callback{
public void surfaceCreated(SurfaceHolder holder) {
if(position >0 && videoFile != null){
try {
playVideo(videoFile);
Log.i(TAG,"position="+ position);
mediaPlayer.seekTo(position);
position = 0;
} catch (IOException e) {
Log.e(TAG,e.toString());
}
}
Log.i(TAG, "surfaceCreated");
}
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
public void surfaceDestroyed(SurfaceHolder holder) {
if(mediaPlayer != null && mediaPlayer.isPlaying()){
position = mediaPlayer.getCurrentPosition();
mediaPlayer.stop();
}
Log.i(TAG, "surfaceDestroyed");
}
}
爲SurfaceView對象添加Callback對象
holder.addCallback(new SurfaceCallback());
2.解決內存不足時應用被殺死問題(應用程序如處於後臺,且系統需要內存時會把應用殺死,此時回到播放器界面,需要重新調用onCreate()方法):
protected void onRestoreInstanceState(Bundle savedInstanceState) {
position = savedInstanceState.getInt("position");
String fn = savedInstanceState.getString("fileName");
if(fn!=null){
videoFile = new File(Environment.getExternalStorageDirectory(),fn);
}
super.onRestoreInstanceState(savedInstanceState);
}
protected void onSaveInstanceState(Bundle outState) {
outState.putInt("position", position);
outState.putString("fileName", videoFile.getName());
super.onSaveInstanceState(outState);
此時應解決SurfaceView的重建問題:
private final class SurfaceCallback implements Callback{
public void surfaceCreated(SurfaceHolder holder) {
if(position >0 && videoFile != null){
try {
playVideo(videoFile);
Log.i(TAG,"position="+ position);
mediaPlayer.seekTo(position);
position = 0;
} catch (IOException e) {
Log.e(TAG,e.toString());
}
}
Log.i(TAG, "surfaceCreated");
}
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
public void surfaceDestroyed(SurfaceHolder holder) {
if(mediaPlayer != null && mediaPlayer.isPlaying()){
position = mediaPlayer.getCurrentPosition();
mediaPlayer.stop();
}
Log.i(TAG, "surfaceDestroyed");
}
}
爲SurfaceView對象添加Callback對象
holder.addCallback(new SurfaceCallback());
2.解決內存不足時應用被殺死問題(應用程序如處於後臺,且系統需要內存時會把應用殺死,此時回到播放器界面,需要重新調用onCreate()方法):
protected void onRestoreInstanceState(Bundle savedInstanceState) {
position = savedInstanceState.getInt("position");
String fn = savedInstanceState.getString("fileName");
if(fn!=null){
videoFile = new File(Environment.getExternalStorageDirectory(),fn);
}
super.onRestoreInstanceState(savedInstanceState);
}
protected void onSaveInstanceState(Bundle outState) {
outState.putInt("position", position);
outState.putString("fileName", videoFile.getName());
super.onSaveInstanceState(outState);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.