前言
AndroID 从 4.0 开始就提供了手机录屏方法,但是需要 root 权限,比较麻烦不容易实现。但是从 5.0 开始,系统提供给了 app 录制屏幕的一系列方法,不需要 root 权限,只需要用户授权即可录屏,相对来说较为简单。本文是在参考了网络上其他录屏资料后完成的, 感谢 。以下将介绍开发录屏功能的一系列步骤以及实现过程中所遇到的一些需要注意的事项。
实现步骤
1、在清单文件中声明需要的权限
因为录制用到麦克风,所以需要加上 AUdio 权限,
<uses-permission androID:name="androID.permission.RECORD_AUdio" /><uses-permission androID:name="androID.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission androID:name="androID.permission.READ_EXTERNAL_STORAGE"/>
如果开发的 app targetAPI 在 6.0 以上时,还需要动态获取权限。
public static voID checkPermission(AppCompatActivity activity) { if (Build.VERSION.SDK_INT >= 23) { int checkPermission = ContextCompat.checkSelfPermission(activity,Manifest.permission.RECORD_AUdio) + ContextCompat.checkSelfPermission(activity,Manifest.permission.READ_PHONE_STATE) + ContextCompat.checkSelfPermission(activity,Manifest.permission.WRITE_EXTERNAL_STORAGE) + ContextCompat.checkSelfPermission(activity,Manifest.permission.READ_EXTERNAL_STORAGE); if (checkPermission != PackageManager.PERMISSION_GRANTED) { //动态申请 ActivityCompat.requestPermissions(activity,new String[]{ Manifest.permission.RECORD_AUdio,Manifest.permission.READ_PHONE_STATE,Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE},123); return; } else { return; } } return; }
2、获取用户录制屏幕授权
这里先介绍 mediaprojectionmanager,mediaprojectionmanager 是系统提供的一种服务,当我们拿到这个服务对象,可以创建一个 Intent ,通过这个 Intent 可以启动一个d框样式的 Activity,如果用户授权了,那我们便可以继续下一步屏幕录制。需要说明的是,Intent 是去启动另一个 Activity 的,有极少极少的机型是没有对应的授权Activity 的,所以这里需要多加判断,防止应用奔溃。
mediaprojectionmanager mediaprojectionmanager = (mediaprojectionmanager) activity. getSystemService(Context.MEDIA_PROJECTION_SERVICE); if (mediaprojectionmanager != null){ Intent intent = mediaprojectionmanager.createScreenCaptureIntent(); PackageManager packageManager = activity.getPackageManager(); if (packageManager.resolveActivity(intent,PackageManager.MATCH_DEFAulT_ONLY) != null){ //存在录屏授权的Activity activity.startActivityForResult(intent,requestCode); }else { Toast.makeText(activity,R.string.can_not_record_tip,Toast.LENGTH_SHORT).show(); } }
3、在 onActivityResult 对用户的授权做处理
即使用户授权了,同意录制 *** 作,仍然需要捕获异常,因为有可能会出现这样一种情况,就是用户在同意录屏的时候系统也正在录屏,录屏 *** 作冲突了。
@OverrIDe protected voID onActivityResult(int requestCode,int resultCode,Intent data) { super.onActivityResult(requestCode,resultCode,data); if (requestCode == REQUEST_CODE && resultCode == Activity.RESulT_OK){ try { ScreenUtil.setUpData(resultCode,data); } catch (Exception e) { e.printstacktrace(); } } else { ToastUtil.show(this,"拒绝录屏"); } }
4、初始化 MediaRecorder、创建 Virtualdisplay
@TargetAPI(Build.VERSION_CODES.LolliPOP) private voID setUpMediaRecorder() { mRecordfilePath = getSaveDirectory() + file.separator+ System.currentTimeMillis() + ".mp4"; if (mMediaRecorder == null){ mMediaRecorder = new MediaRecorder(); } //设置音频来源 mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); //设置视频来源 mMediaRecorder.setVIDeoSource(MediaRecorder.VIDeoSource.SURFACE); //输出的录屏文件格式 mMediaRecorder.setoutputFormat(MediaRecorder.OutputFormat.MPEG_4); //录屏文件路径 mMediaRecorder.setoutputfile( mRecordfilePath ); //视频尺寸 mMediaRecorder.setVIDeoSize(mRecorDWIDth,mRecordHeight); //音视频编码器 mMediaRecorder.setVIDeoEncoder(MediaRecorder.VIDeoEncoder.H264); mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); //比特率 mMediaRecorder.setVIDeoEnCodingBitRate((int) (mRecorDWIDth * mRecordHeight * 3.6)); //视频帧率 mMediaRecorder.setVIDeoFrameRate(20); try { mMediaRecorder.prepare(); } catch (IOException e) { e.printstacktrace(); } }
这一步是整个录屏 *** 作最为关键的一步!我们初始化了 MediaRecorder,设置了是否录上声音、录屏文件格式、录屏文件路径、音视频的编码器、比特率、视频帧率等
然后将在步骤 3 中的 resultCode 以及 data 作为必要的参数通过 mediaprojectionmanager 创建 Virtualdisplay。Virtualdisplay 可以理解为虚拟的呈现器,它可以捕获屏幕上的内容,并将其捕获的内容渲染到 Surface 上(Surace 由 MediaRecorder 提供,通过 getSurface() 方法得到),MediaRecorder 再进一步将其封装处理为 Mp4 文件。
经过以上步骤 prepare 之后,当再次调用 MediaRecorder.start() 就可以开始录屏了,这里同意也需要注意的时,调用 start() 方法开始录屏之后,不能立即调用 stop()方法停止录屏,否则会奔溃。测试在测试录屏功能时立马停止录屏,应用奔溃,一直找不到原因。直到看到了源码( API 26 )里的注释
所以为了反正奔溃,在 stop 的时候捕获异常,并且置空 MediaRecorder,下次录屏的时候再重新生成 MediaRecorder。
最后
由于知识水平有限,难免有错误遗漏,欢迎指正!项目地址为 屏幕录制
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。
您可能感兴趣的文章:Android5.1 取消录制屏幕跳出的权限对话框问题Android 录制手机屏幕视频生成GIF图片实例详解 总结以上是内存溢出为你收集整理的Android 5.0+ 屏幕录制实现的示例代码全部内容,希望文章能够帮你解决Android 5.0+ 屏幕录制实现的示例代码所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)