启动Android视频播放器Activity时如何禁止其播放完成后自动退出
核心前提说明
你通过Intent.ACTION_VIEW调用的是系统默认/用户自行设置的第三方视频播放器,播放结束后的退出逻辑由播放器自身实现,Android系统没有提供标准化的强制控制API,可通过两种方案实现需求:
方案1:给Intent添加通用额外参数(兼容性依赖播放器实现)
绝大多数主流系统自带播放器、第三方通用播放器都适配了两个行业通用的额外参数,你可以直接在原代码中添加参数即可:
File file = new File(galleryList.get(getAbsoluteAdapterPosition()).getPath()); Intent i = new Intent(Intent.ACTION_VIEW); if (GalleryMediaHelper.isVideoFile(galleryList.get(getAbsoluteAdapterPosition()).getPath())) { i.setDataAndType(FileProvider.getUriForFile(context, AUTHORITY, file), "video/*"); } // 新增参数:开启循环播放,和下方结束不退出参数二选一即可 i.putExtra("looping", true); // 新增参数:播放完成后不自动退出,停在最后一帧,和上方循环参数二选一即可 // i.putExtra("exit_on_completion", false); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); if (i.resolveActivity(context.getPackageManager()) != null) context.startActivity(i);
该方案优势是不需要修改原有业务逻辑,缺点是不能保证100%适配所有设备,部分厂商定制ROM的自带播放器可能不识别上述参数。
方案2:内嵌播放组件(100%可控,兼容性最好)
如果要求所有设备都符合需求,建议直接在应用内嵌入播放组件,完全自行控制播放逻辑,比如使用系统原生VideoView或Jetpack Media3组件:
// 布局中添加VideoView组件后直接调用 VideoView videoView = findViewById(R.id.video_view); Uri videoUri = FileProvider.getUriForFile(context, AUTHORITY, file); // 授予Uri读取权限 context.grantUriPermission(context.getPackageName(), videoUri, Intent.FLAG_GRANT_READ_URI_PERMISSION); videoView.setVideoURI(videoUri); videoView.setOnPreparedListener(mediaPlayer -> { // 方案A:开启循环播放 mediaPlayer.setLooping(true); // 方案B:播放完成后停在最后一帧,不自动退出,注释上一行打开下面代码即可 /* mediaPlayer.setOnCompletionListener(mp -> { // 不需要做额外操作,默认停在最后画面,用户点返回键关闭当前播放页面即可 }); */ }); videoView.start();
内容的提问来源于stack exchange,提问作者user14576370
相关产品推荐
相关产品推荐

