按下锁定键后视频寻找状态复位

时间:2014-07-04 10:15:58

标签: android android-videoview

我面临与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();
}

}

你能指导我吗?

2 个答案:

答案 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();
}   

}

试一试,祝你好运。