Android:截屏/视频截图

文章介绍了如何在Android应用中截取包含视频当前播放帧的界面。首先,需要获取设备存储的读写权限,并自定义一个MyVideoView组件来处理视频播放。然后,利用MediaMetadataRetriever获取视频关键帧截图,再结合Canvas将视频截图合并到整个应用界面的截图上,以解决视频区域显示为黑屏的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求描述

实现截取Android应用当前界面的功能,需包含界面中视频(此博客的参考代码以存储在设备本地的视频为例,未检验在线视频的情况)当前的播放帧截图。

调研准备

首先应用需要获取设备存储的读写权限,需要在AndroidManifest.xml中加上请求权限的配置代码:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

此外,Android原生的视频播放组件VideoView不支持修改视频的分辨率(视频分辨率与容器宽高不一致时,需要让视频拉伸填充容器),因此需要自己封装一个继承了VideoView的组件;在项目中新建一个MyVideoView.java,内容如下:

package XXX;

import android.content.Context;
import android.media.MediaPlayer;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.VideoView;
import com.lzy.okgo.utils.HttpUtils;
import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class MyVideoView extends VideoView {
  private static final String TAG = "####MyVideoView ";
  
  // 记录当前播放视频的路径(用于截取播放帧)
  private String currentVideoUrl;
  
  public MyVideoView(Context paramContext) {
    super(paramContext);
  }
  
  public MyVideoView(Context paramContext, AttributeSet paramAttributeSet) {
    super(paramContext, paramAttributeSet);
  }
  
  public MyVideoView(Context paramContext, AttributeSet paramAttributeSet, int paramInt) {
    super(paramContext, paramAttributeSet, paramInt);
  }
  
  // 判断是否为视频文件
  public static boolean isVideo(String filePath) {
    filePath = filePath.toLowerCase();
    String[] vFiles = {".mov", ".mkv", ".mp4", ".avi"};
    for (byt
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值