没有合适的资源?快使用搜索试试~ 我知道了~
android MediaRecorder实现录屏时带录音功能
12 下载量 162 浏览量
2021-01-03
13:01:41
上传
评论
收藏 117KB PDF 举报
温馨提示
下面说说android的事把 最近是不是也会遇到需求中需要用到录屏录音的功能,最近也是遇到的 现在整理完记录一下 首先呢,录音录屏需要权限 先贴一个动态权限类 public class TalAllow { /** * RECORD_AUDIO 音频权限 * WRITE_EXTERNAL_STORAGE 写入权限 * CAMERA 相机权限 */ public static void requestPermissions(Context context,int allowCode) { ArrayList<String> ps =
资源推荐
资源详情
资源评论
android MediaRecorder实现录屏时带录音功能实现录屏时带录音功能
下面说说android的事把
最近是不是也会遇到需求中需要用到录屏录音的功能,最近也是遇到的 现在整理完记录一下
首先呢,录音录屏需要权限 先贴一个动态权限类
public class TalAllow {
/**
* RECORD_AUDIO 音频权限
* WRITE_EXTERNAL_STORAGE 写入权限
* CAMERA 相机权限
*/
public static void requestPermissions(Context context,int allowCode) {
ArrayList<String> ps = new ArrayList<>();
int per = ContextCompat.checkSelfPermission(context, Manifest.permission.RECORD_AUDIO);
if (per != PackageManager.PERMISSION_GRANTED) {
ps.add(Manifest.permission.RECORD_AUDIO);
}
per = ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (per != PackageManager.PERMISSION_GRANTED) {
ps.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
per = ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA);
if (per != PackageManager.PERMISSION_GRANTED) {
ps.add(Manifest.permission.CAMERA);
}
per = ContextCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE);
if (per != PackageManager.PERMISSION_GRANTED) {
ps.add(Manifest.permission.READ_PHONE_STATE);
}
Log.d(TAG, "requestPermissions:ps=" + ps.size());
if (!ps.isEmpty()) {
String[] ps3 = new String[ps.size()];
ps.toArray(ps3);
ActivityCompat.requestPermissions((Activity) context, ps3, allowCode);
}
}
}
有需求需要判断权限的呢 插入个链接 (上面那个类code码为100)
判断是否有权限
下面重点来了
首先说明一下这个录屏和录音是在服务里面做的,所以呢贴一个服务类
这个代码绝对有质量 做了很多处理,下面一行一行解读把
//首先呢实现的是Handle.Callback接口 主要是做时间及计时时间回调的,会重新写HandleMessage方法,其实我个觉得跟在括号{} 里面重写没啥区别就是简
洁页面
public class TalScreenRecordService extends Service implements Handler.Callback {
//这个就不解释了吧 log
private static final String TAG = "TalScreenRecordService";
//这个类是管理类拿到服务后会通过下面的类申请录屏,点击允许,
//其中会回调两个参数,code码 和 data,都在ActivityForResult中进行判断code
private MediaProjectionManager mProjectionManager;
//这个会拿到申请的结果
private MediaProjection mMediaProjection;
//这个类就是我们主要的录屏录音的类啦
private MediaRecorder mMediaRecorder;
//这个就是我们要获取录制屏幕的大小,像素,等等一些数据
//关于这类更详细的介绍https://blog.csdn.net/qq_16628781/article/details/62038163
private VirtualDisplay mVirtualDisplay;
//是否正在录制 false 没有录制
private boolean mIsRunning;
//获取屏幕的宽高和像素密度 稍后贴类
private int mRecordWidth = TalScreenParams.getScreenWidth();
private int mRecordHeight = TalScreenParams.getScreenWidth();
private int mScreenDpi = TalScreenParams.getScreenDpi();
//code data 就是上面说的允许后回调
private int mResultCode;
private Intent mResultData;
//录屏文件的保存地址
private String mRecordFilePath;
private Handler mHandler;
//已经录制多少秒了
private int mRecordSeconds = 0;
//handle发送消息时的what
private static final int MSG_TYPE_COUNT_DOWN = 110;
//这个是继承Service 必须重写的方法 这是使用的BindService(生命周期的长短跟activity一致)
@Override
public IBinder onBind(Intent intent) {
return new RecordBinder();
}
//说一说这个返回值的问题吧
// START_STICKY 粘性返回 ,一次失败,多次启动,不保留Intent对象
//关于返回值问题https://blog.csdn.net/github_37663523/article/details/78811539
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
@Override
public void onCreate() {
super.onCreate();
//没有录制
mIsRunning = false;
//创建对象 在create方法里只执行一次
mMediaRecorder = new MediaRecorder();
// 由于实现了CallBack接口,在这里注册一下接口(个人觉得高大的写法,简洁)
mHandler = new Handler(Looper.getMainLooper(), this);
}
@Override
public void onDestroy() {
super.onDestroy();
}
//数据不为空
public boolean isReady() {
return mMediaProjection != null && mResultData != null;
}
//清除的方法 避免内存泄漏 相信都看得懂
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public void clearRecordElement() {
clearAll();
if (mMediaRecorder != null) {
mMediaRecorder.reset();
mMediaRecorder.release();
mMediaRecorder = null;
}
mResultData = null;
//不执行的时候false
mIsRunning = false;
}
//这个就是给是否正在录屏提供一个get方法
public boolean ismIsRunning() {
return mIsRunning;
}
//这个就是设置数据的方法在ActivityForResult中设置数据,说明是允许录屏的
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public void setResultData(int resultCode, Intent resultData) {
mResultCode = resultCode;
mResultData = resultData;
//拿到这个管理,看不懂跟上面注释结合看
mProjectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
//getMediaProjection(code,data)不知道这样写看不看的董
//说白了MediaProjectionManager是申请权限 MediaProjection是获取申请结果,防止别人调取隐私
//再通过上面的setResultData方法获取到ActivityForResult中的code,data
if (mProjectionManager != null) {
mMediaProjection = mProjectionManager.getMediaProjection(mResultCode, mResultData);
}
}
//开始录制了
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public boolean startRecord() {
//代码执行顺序(false,目前没录屏)
if (mIsRunning) {
return false;
}
//再次创建,防止异常
if (mMediaProjection == null) {
mMediaProjection = mProjectionManager.getMediaProjection(mResultCode, mResultData);
}
//关于文件路径还有录屏的一些参数问题
setUpMediaRecorder();
//关于获取录制屏幕的大小,像素,等等一些数据
createVirtualDisplay();
//开始录制
剩余11页未读,继续阅读
资源评论
weixin_38727567
- 粉丝: 7
- 资源: 874
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- HTML与CSS制作的静态圣诞树图案教程
- 基于STM32单片机的智能晾衣架高分项目源码(小白也可实战).zip
- STM32+ESP8266 WIFI遥控小车源码
- C# winform新版盒盖机[完整源码解压后1.8G].zip
- Python实现控制台圣诞树图形打印
- node-v20.10.0-x64.msi 下载
- 约瑟夫问题及递推公式的计算机科学应用
- 基于stm32f103c8t6的智能台灯源码
- 本地磁盘学习使用仅供参考
- C# winform-SerialPort串口Demo.zip
- putty远程连接服务器利器,ssh连接工具
- 二维码生成工具,适用于window平台汉字转二维码的工具,文本传输
- openEuler 22.03-SP4 在线部署 Kubernetes
- C# WPF-CCS线体,写的测试MES用的Demo .zip
- 自动蒸馏清洁机sw18可编辑全套技术开发资料100%好用.zip
- C++实现Qt和Mysql的智能停车场管理系统源码+数据库(高分项目)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功