Android中Intent调用VideoView播放视频无缩略图问题求助
解决Android隐式Intent调用系统播放器无视频缩略图的问题
首先得明确:你现在用的是隐式Intent调用系统自带的视频播放器,这种情况下你的代码完全无法控制系统播放器的界面行为——包括缩略图加载,所以你尝试的seekTo()方法根本作用不到目标播放器上,自然不会生效。
下面给你两种可行的解决方案,根据你的需求选择:
方案一:自定义VideoView播放,自己控制缩略图
如果希望完全掌控播放界面(包括缩略图),建议自己实现VideoView播放逻辑,步骤如下:
- 在布局中添加VideoView和用于显示缩略图的ImageView:
<RelativeLayout android:layout_width="match_parent" android:layout_height="200dp"> <VideoView android:id="@+id/video_view" android:layout_width="match_parent" android:layout_height="match_parent"/> <ImageView android:id="@+id/iv_thumbnail" android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="centerCrop"/> <ImageView android:id="@+id/icon_play" android:layout_width="60dp" android:layout_height="60dp" android:layout_centerInParent="true" android:src="@drawable/ic_play"/> </RelativeLayout>
- 在代码中用
MediaMetadataRetriever获取视频第一帧作为缩略图,点击播放时隐藏缩略图:
private VideoView mVideoView; private ImageView mThumbnailIv; private String videoUrl = "https://someUrl/Video/v07.mp4"; @OnClick(R.id.icon_play) protected void playVideo() { // 隐藏缩略图,开始播放 mThumbnailIv.setVisibility(View.GONE); mVideoView.setVideoURI(Uri.parse(videoUrl)); mVideoView.start(); } private void loadVideoThumbnail() { new Thread(() -> { MediaMetadataRetriever retriever = new MediaMetadataRetriever(); try { retriever.setDataSource(videoUrl, new HashMap<>()); // 获取视频第一帧 Bitmap bitmap = retriever.getFrameAtTime(1, MediaMetadataRetriever.OPTION_CLOSEST_SYNC); if (bitmap != null) { runOnUiThread(() -> mThumbnailIv.setImageBitmap(bitmap)); } } catch (Exception e) { e.printStackTrace(); } finally { retriever.release(); } }).start(); } // 在onCreate中初始化 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_video); mVideoView = findViewById(R.id.video_view); mThumbnailIv = findViewById(R.id.iv_thumbnail); loadVideoThumbnail(); }
方案二:保留隐式Intent播放,先在本地显示缩略图
如果坚持用系统播放器,那可以先在你的界面上显示视频缩略图,点击缩略图/播放按钮再启动系统播放器,模拟YouTube的封面效果:
- 布局里只需要播放按钮+缩略图ImageView(和方案一的布局类似,去掉VideoView)
- 用同样的
MediaMetadataRetriever方法加载缩略图,点击播放按钮时启动Intent:
@OnClick(R.id.icon_play) protected void playVideo(){ String videoUrl="https://someUrl/Video/v07.mp4"; if(!videoUrl.isEmpty()) { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(videoUrl)); intent.setDataAndType(Uri.parse(videoUrl), "video/mp4"); startActivity(intent); } } // 同样在onCreate中调用loadVideoThumbnail方法加载缩略图 private void loadVideoThumbnail() { // 和方案一的代码完全一致 }
注意事项
- 处理网络视频时,
MediaMetadataRetriever的操作必须放在子线程,避免阻塞主线程 - Android 9及以上,如果视频链接是HTTP(你的是HTTPS没问题),需要在
AndroidManifest.xml的<application>标签中添加android:usesCleartextTraffic="true" - 别忘了添加网络权限:
<uses-permission android:name="android.permission.INTERNET"/>
内容的提问来源于stack exchange,提问作者Aayushi
相关产品推荐
相关产品推荐

