Android从4.0开始提供手机录制方法,但是需要root权限。5.0开始,提供不需要root的app录制方法,只需要用户授权。
清单文件中声明的权限:
<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"/>
在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;
}
获取用户录制屏幕授权
MediaProjectionManager系统提供的一种服务,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();
}
}
在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,"拒绝录屏");
}
}
初始化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();
}
}
网友评论