Android VideoView中的“后退”按钮存在问题

Android VideoView中的“后退”按钮存在问题,android,back,android-videoview,Android,Back,Android Videoview,按下“后退”按钮时,我很难真正完成我的活动。我正在运行一个非常简单的视频视图,使用progressdialog来显示加载对话框和onpreparedlistener等简单的东西。无论如何,当前当我按下后退按钮时,它将取消progressdialog,并留下一个黑屏,再次按下,progressdialog将重新启动!!!然后,当我再次点击后退按钮时,它会显示一个警告对话框,“视频无法播放。”非常烦人。谢谢你的帮助 public class VideoActivity extends Activit

按下“后退”按钮时,我很难真正完成我的活动。我正在运行一个非常简单的视频视图,使用progressdialog来显示加载对话框和onpreparedlistener等简单的东西。无论如何,当前当我按下后退按钮时,它将取消progressdialog,并留下一个黑屏,再次按下,progressdialog将重新启动!!!然后,当我再次点击后退按钮时,它会显示一个警告对话框,“视频无法播放。”非常烦人。谢谢你的帮助

public class VideoActivity extends Activity {

    private VideoView mVideoView;

    private static ProgressDialog progressdialog;
    private String path;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.videoview);


        progressdialog = ProgressDialog.show(this, "", " Video Loading...", true);
        progressdialog.setCancelable(true);

        mVideoView = (VideoView) findViewById(R.id.surface_view);
        mVideoView.setMediaController(new MediaController(this));
        Bundle b = this.getIntent().getExtras();
        path = b.getString("path");
        mVideoView.setVideoURI(Uri.parse(path));


        mVideoView.setOnPreparedListener(new OnPreparedListener() {

            public void onPrepared(MediaPlayer mp) {
                progressdialog.dismiss();
                mVideoView.requestFocus();
                mVideoView.start();

            }
        });

    }

    @Override
    public void onBackPressed() {
        // TODO Auto-generated method stub
        super.onBackPressed();

        super.finish();

    }

}
finish()不会终止您的活动,它只是向Android发出信号,表示不再需要运行该活动


我记得解决这个问题的方法是将“return”放在适当的位置。

您需要创建一个自定义MediaController类,并重写dispatchKeyEvent函数以捕获back KeyEvent并告诉活动完成

有关更多信息,请参阅

public class CustomMediaController extends MediaController {
    public CustomMediaController(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomMediaController(Context context, boolean useFastForward) {
        super(context, useFastForward);
    }

    public CustomMediaController(Context context) {
        super(context, true);
    }

    public boolean dispatchKeyEvent(KeyEvent event)
    {
        if (event.getKeyCode() == KeyEvent.KEYCODE_BACK)
            ((Activity) getContext()).finish();

        return super.dispatchKeyEvent(event);
    }
}
来自CommansWare

根据源代码,这应该是可行的:

  • 扩展MediaController(对于此答案,请调用它 Ronnie(中央控制器)
  • 重写RonnieMediaController中的dispatchKeyEvent()
  • 在链接到超类之前,请检查KeyEvent.KEYCODE\u BACK, 如果遇到这种情况,请告诉您的活动完成()
  • 使用RonnieMediaController而不是MediaController与您的 视频视图
  • 就我个人而言,我还是不去管它,因为这次改变了你的用户 无法按需使控制器消失

    您只需编写:(无需为MediaController创建新类)


    我觉得问题在于,按back press只是取消了videoview,而活动又重新启动了videoview。我似乎也无法覆盖这一点…这根本不是一个有效的语句。:“当您的活动完成并应关闭时调用此命令。ActivityResult将通过onActivityResult()传播回启动您的人。”System.exit()可能重复是Android上的反模式。似乎VideoView会使用ACTION_DOWN事件,因此ACTION_UP不会触发dispatchKeyEvent()。这可以通过为KEYCODE返回操作DOWN上的
    false
    而不是调用super来轻松解决。(但请确保允许所有其他键码调用super!)
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            System.exit(0);
        }
    
        return false;
    }
    
    mVideoView.setMediaController(new MediaController(this){
            public boolean dispatchKeyEvent(KeyEvent event)
            {
                if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP)
                    ((Activity) getContext()).finish();
    
                return super.dispatchKeyEvent(event);
            }
        });