# ScreenRecorder
## Android 5.0+ 屏幕录制
从 Android 4.4 开始支持手机端本地录屏,但首先需要获取 root 权限才行,Android 5.0 引入 MediaProject,
可以不用 root 就可以录屏,但需要弹权限获取窗口,需要用户允许才行,这里主要介绍 Android 5.0+ 利用
MediaProject 在非 root 情况下实现屏幕录制。
## 基本原理
在 Android 5.0,Google 终于开放了视频录制的接口,其实严格来说,是屏幕采集的接口,也就是 MediaProjection
和 MediaProjectionManager。
## 具体实现步骤
### 1 申请权限
在 AndroidManifest 中添加权限
```
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
```
Android 6.0 加入的动态权限申请,如果应用的 `targetSdkVersion` 是 23,申请敏感权限还需要动态申请
```
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE}, STORAGE_REQUEST_CODE);
}
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.RECORD_AUDIO)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.RECORD_AUDIO}, AUDIO_REQUEST_CODE);
}
```
### 2 获取 MediaProjectionManager 实例
`MediaProjectionManager ` 也是系统服务的一种,通过 `getSystemService` 来获取实例
```
MediaProjectionManager projectionManager = (MediaProjectionManager) getSystemService(MEDIA_PROJECTION_SERVICE);
```
### 3 发起屏幕捕捉请求
```
Intent captureIntent= projectionManager.createScreenCaptureIntent();
startActivityForResult(captureIntent, REQUEST_CODE);
```
### 4 获取 MediaProjection
通过 `onActivityResult` 返回结果获取 `MediaProjection `
```
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == RECORD_REQUEST_CODE && resultCode == RESULT_OK) {
mediaProjection = projectionManager.getMediaProjection(resultCode, data);
}
}
```
### 5 创建虚拟屏幕
这一步就是通过 `MediaProject` 录制屏幕的关键所在,`VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR` 参数是指创建屏幕镜像,所以我们实际录制内容的是屏幕镜像,但内容和实际屏幕是一样的,并且这里我们把 `VirtualDisplay` 的渲染目标 Surface 设置为 `MediaRecorder` 的 `getSurface`,后面我就可以通过 `MediaRecorder` 将屏幕内容录制下来,并且存成 video 文件
```
private void createVirtualDisplay() {
virtualDisplay = mediaProjection.createVirtualDisplay(
"MainScreen",
width,
height,
dpi,
DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
mediaRecorder.getSurface(),
null, null);
}
```
### 6 录制屏幕数据
这里利用 `MediaRecord` 将屏幕内容保存下来,当然也可以利用其它方式保存屏幕内容,例如:`ImageReader`
```
private void initRecorder() {
File file = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis() + ".mp4");
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mediaRecorder.setOutputFile(file.getAbsolutePath());
mediaRecorder.setVideoSize(width, height);
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mediaRecorder.setVideoEncodingBitRate(5 * 1024 * 1024);
mediaRecorder.setVideoFrameRate(30);
try {
mediaRecorder.prepare();
} catch (IOException e) {
e.printStackTrace();
}
}
public boolean startRecord() {
if (mediaProjection == null || running) {
return false;
}
initRecorder();
createVirtualDisplay();
mediaRecorder.start();
running = true;
return true;
}
```
没有合适的资源?快使用搜索试试~ 我知道了~
android投屏pc及电脑adb控制手机
共1397个文件
png:472个
xml:467个
json:127个
5星 · 超过95%的资源 需积分: 47 418 下载量 123 浏览量
2017-11-08
17:50:07
上传
评论 21
收藏 54.43MB ZIP 举报
温馨提示
android投屏到pc,支持5.0以上,socket通信,adb反向控制。
资源推荐
资源详情
资源评论
收起资源包目录
android投屏pc及电脑adb控制手机 (1397个子文件)
aa 6KB
MediaSessionCompat.aidl 787B
ParcelableVolumeInfo.aidl 689B
PlaybackStateCompat.aidl 688B
MediaMetadataCompat.aidl 680B
ResultReceiver.aidl 675B
RatingCompat.aidl 673B
resources-debug.ap_ 284KB
resources-debug.ir.ap_ 6KB
resources-debug.ap_ 6KB
resources-debug-androidTest.ap_ 765B
resources-debug-androidTest.ap_ 760B
recorder-debug.apk 5.03MB
recorder-debug-unaligned.apk 5.03MB
app-debug.apk 61KB
gradlew.bat 2KB
gradlew.bat 2KB
fileSnapshots.bin 3.44MB
fileHashes.bin 454KB
fileSnapshots.bin 364KB
taskArtifacts.bin 127KB
localClassSetAnalysis.bin 125KB
taskArtifacts.bin 116KB
fileSnapshotsToTreeSnapshotsIndex.bin 26KB
fileSnapshotsToTreeSnapshotsIndex.bin 26KB
fileHashes.bin 26KB
localJarClasspathSnapshot.bin 23KB
localClassSetAnalysis.bin 20KB
localJarClasspathSnapshot.bin 18KB
cc 11KB
MainActivity.class 34KB
MainActivity.class 34KB
R$styleable.class 20KB
R$styleable.class 20KB
R$style.class 20KB
R$style.class 20KB
RecordService.class 15KB
RecordScreenService.class 11KB
R$attr.class 9KB
R$attr.class 9KB
MainActivity2.class 5KB
MainActivity.class 5KB
MainActivity.class 5KB
R$dimen.class 5KB
R$dimen.class 5KB
R$drawable.class 4KB
R$drawable.class 4KB
MainActivity.class 4KB
MainActivity3.class 4KB
R$color.class 4KB
AndroidImagePanel.class 4KB
R$color.class 4KB
AndroidAdbUtils.class 4KB
RecordService$1.class 4KB
R$id.class 4KB
AdbConstants.class 4KB
R$id.class 4KB
MainActivity$1.class 3KB
MainActivity$1.class 3KB
MainActivity2$2.class 3KB
MainActivity$2.class 3KB
MainActivity$2.class 3KB
AndroidImageFrame.class 3KB
RecordScreenService$3.class 3KB
Client.class 3KB
BuildConfig.class 2KB
BuildConfig.class 2KB
IvfWriter.class 2KB
MainActivity$3.class 2KB
R$layout.class 2KB
R.class 2KB
R.class 2KB
R$layout.class 2KB
R$id.class 2KB
R$id.class 2KB
R$string.class 2KB
R$string.class 2KB
R$drawable.class 2KB
R$drawable.class 2KB
R$layout.class 2KB
R$layout.class 2KB
R$attr.class 2KB
R$attr.class 2KB
CameraStream.class 2KB
RecordService$2.class 2KB
SocketStreamWork.class 2KB
MainActivity$1.class 2KB
R$string.class 2KB
MainActivity2$1.class 2KB
R$string.class 1KB
MyService.class 1KB
Common.class 1KB
AndroidScreenPanel.class 1KB
MainActivity3$2.class 1KB
AndroidAdbUtils$StreamGobbler.class 1KB
AndroidImageFrame$3.class 1KB
AndroidImageFrame$1.class 1KB
AndroidImageFrame$2.class 1KB
AndroidScreen.class 1KB
SendBytesSocket.class 1KB
共 1397 条
- 1
- 2
- 3
- 4
- 5
- 6
- 14
monkey大王
- 粉丝: 16
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
前往页