我面临与VideoView相关的问题,即从锁定键中断返回后它正在重置到初始位置。我提供了如下的src代码供您参考:
public class BNAboutVideoActivity extends Activity {
private MediaController mMediaController;
VideoView mVideoView;
private BNAudioManager mBNAudioManager;
int position = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_about_video);
mVideoView = (VideoView) findViewById(R.id.videoview);
mBNAudioManager = BNAudioManager.getInstance(this);
Uri uri = Uri.parse("android.resource://" + getPackageName() + "/" +R.raw.bn_about_video);
mMediaController = new MediaController(this);
mVideoView.setMediaController(mMediaController);
mVideoView.setVideoURI(uri);
mVideoView.start();
mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
finish();
if(BNAboutAdapter.bAboutPause)
{
mBNAudioManager.resumePlayer();
BNAboutAdapter.bAboutPause = false;
}
}
});
}
/* (non-Javadoc)
* @see android.app.Activity#onBackPressed()
*/
@Override
public void onBackPressed() {
// TODO Auto-generated method stub
super.onBackPressed();
if(BNAboutAdapter.bAboutPause)
{
mBNAudioManager.resumePlayer();
BNAboutAdapter.bAboutPause = false;
}
}
/* (non-Javadoc)
* @see android.app.Activity#onPause()
*/
@Override
protected void onPause() {
// TODO Auto-generated method stub
position = mVideoView.getCurrentPosition();
mVideoView.pause();
super.onPause();
}
/* (non-Javadoc)
* @see android.app.Activity#onResume()
*/
@Override
protected void onResume() {
// TODO Auto-generated method stub
mVideoView.seekTo(position);
mVideoView.resume();
super.onResume();
}
}
你能指导我吗?
答案 0 :(得分:0)
问题是你在onCompletion callback()中调用finish(),当你重新进入Activity onCreate()时会执行,所以视频从头开始重启! finish()会破坏Activity,因此位置会丢失(当应用程序通过onResume()时,位置将为0)。你应该重新考虑坚持你的视频状态。可能最好不要破坏活动。
我在代码中看到的另一个问题是关于onBackPressed()中的代码。为什么要在onBackPressed()中恢复视频? onBackPressed()与所有Android设备都具有的本机后退按钮相同,实际上它会破坏您的活动。你不想处理onBackPressed中的恢复内容,但更多的是持久化数据。
答案 1 :(得分:0)
您需要先了解按下锁定键时的活动生命周期。
按下锁定键:
onPause -> onStop -> onDestroy
因此,当前活动被销毁并重新创建以使用新配置运行。
Dianne Hackborn的解释:
销毁和重新创建活动的原因是使用a运行它 新配置。你还没有说过你是什么 这样做很难知道发生了什么,但我会认为 你强迫你的活动和锁定屏幕的方向 有不同的方向。所以当设备进入睡眠状态时, 显示锁定屏幕并强制进行方向和活动 (现在仍然在活动堆栈的顶部运行)现在需要 使用新方向重新启动。
首先是 - 你的活动真的需要工作 当发生这种情况时正确如果没有,那么你会看到这些 在其他情况下相同的错误。例如,如果用户插入键盘 导致配置更改。或者更改区域设置。或字体大小。和 等等。
现在假设您的活动实际上正常运行,如果有的话 一种配置改变,你真的不关心你可以使用 android:configChanges在你的活动清单中说出来 当发生特定类型的更改时,不应重新启动。
Refere this for complete thread
因此,如果您的API级别大于13,则需要在清单中使用以下活动。
android:configChanges="orientation|keyboardHidden|screenSize"
这应该可以解决问题。
如果问题仍然存在,那么我建议采用以下解决方法:
public class MyActivity extends Activity{
// used to listen for intents which are sent after a task was
// successfully processed
private BroadcastReceiver mUpdateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
// TODO: Put the current position in sharedpreference.
} else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
// TODO: Fetch the value from sharedpreference.
}
}
};
@Override
public void onResume() {
IntentFilter filter = new IntentFilter();
// to listen when screen is unlocked
filter.addAction(Intent.ACTION_SCREEN_ON);
// to listen when screen is locked
filter.addAction(Intent.ACTION_SCREEN_OFF);
registerReceiver(mUpdateReceiver, filter);
super.onResume();
}
@Override
public void onPause() {
unregisterReceiver(mUpdateReceiver);
super.onPause();
}
}
试一试,祝你好运。