一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Android - Android 5.0+ 屏幕錄制實(shí)現(xiàn)的示例代碼

Android 5.0+ 屏幕錄制實(shí)現(xiàn)的示例代碼

2022-02-22 15:18OhHoo Android

這篇文章主要介紹了Android 5.0+ 屏幕錄制實(shí)現(xiàn)的示例代碼,從 5.0 開始,系統(tǒng)提供給了 app 錄制屏幕的一系列方法,不需要 root 權(quán)限,只需要用戶授權(quán)即可錄屏,相對(duì)來(lái)說(shuō)較為簡(jiǎn)單,感興趣的小伙伴們可以參考一下

前言

Android 從 4.0 開始就提供了手機(jī)錄屏方法,但是需要 root 權(quán)限,比較麻煩不容易實(shí)現(xiàn)。但是從 5.0 開始,系統(tǒng)提供給了 app 錄制屏幕的一系列方法,不需要 root 權(quán)限,只需要用戶授權(quán)即可錄屏,相對(duì)來(lái)說(shuō)較為簡(jiǎn)單。本文是在參考了網(wǎng)絡(luò)上其他錄屏資料后完成的, 感謝 。以下將介紹開發(fā)錄屏功能的一系列步驟以及實(shí)現(xiàn)過程中所遇到的一些需要注意的事項(xiàng)。

實(shí)現(xiàn)步驟

1、在清單文件中聲明需要的權(quán)限

因?yàn)殇浿朴玫禁溈孙L(fēng),所以需要加上 AUDIO 權(quán)限,

?
1
2
3
<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"/>

如果開發(fā)的 app targetApi 在 6.0 以上時(shí),還需要?jiǎng)討B(tài)獲取權(quán)限。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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) {
    //動(dòng)態(tài)申請(qǐng)
    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、獲取用戶錄制屏幕授權(quán)

這里先介紹 MediaProjectionManager , MediaProjectionManager 是系統(tǒng)提供的一種服務(wù),當(dāng)我們拿到這個(gè)服務(wù)對(duì)象,可以創(chuàng)建一個(gè) Intent ,通過這個(gè) Intent 可以啟動(dòng)一個(gè)彈框樣式的 Activity,如果用戶授權(quán)了,那我們便可以繼續(xù)下一步屏幕錄制。需要說(shuō)明的是,Intent 是去啟動(dòng)另一個(gè) Activity 的,有極少極少的機(jī)型是沒有對(duì)應(yīng)的授權(quán)Activity 的,所以這里需要多加判斷,防止應(yīng)用奔潰。

?
1
2
3
4
5
6
7
8
9
10
11
12
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){
       //存在錄屏授權(quán)的Activity
       activity.startActivityForResult(intent,requestCode);
      }else {
       Toast.makeText(activity,R.string.can_not_record_tip,Toast.LENGTH_SHORT).show();
      }
     }

3、在 onActivityResult 對(duì)用戶的授權(quán)做處理

即使用戶授權(quán)了,同意錄制操作,仍然需要捕獲異常,因?yàn)橛锌赡軙?huì)出現(xiàn)這樣一種情況,就是用戶在同意錄屏的時(shí)候系統(tǒng)也正在錄屏,錄屏操作沖突了。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
@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、創(chuàng)建 VirtualDisplay

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
 private void setUpMediaRecorder() {
 
  mRecordFilePath = getSaveDirectory() + File.separator+ System.currentTimeMillis() + ".mp4";
  if (mMediaRecorder == null){
   mMediaRecorder = new MediaRecorder();
  }
  //設(shè)置音頻來(lái)源
  mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
  //設(shè)置視頻來(lái)源
  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();
  }
 }

這一步是整個(gè)錄屏操作最為關(guān)鍵的一步!我們初始化了 MediaRecorder,設(shè)置了是否錄上聲音、錄屏文件格式、錄屏文件路徑、音視頻的編碼器、比特率、視頻幀率等

然后將在步驟 3 中的 resultCode 以及 data 作為必要的參數(shù)通過 MediaProjectionManager 創(chuàng)建 VirtualDisplay。VirtualDisplay 可以理解為虛擬的呈現(xiàn)器,它可以捕獲屏幕上的內(nèi)容,并將其捕獲的內(nèi)容渲染到 Surface 上(Surace 由 MediaRecorder 提供,通過 getSurface() 方法得到),MediaRecorder 再進(jìn)一步將其封裝處理為 Mp4 文件。

經(jīng)過以上步驟 prepare 之后,當(dāng)再次調(diào)用 MediaRecorder.start() 就可以開始錄屏了,這里同意也需要注意的時(shí),調(diào)用 start() 方法開始錄屏之后,不能立即調(diào)用 stop()方法停止錄屏,否則會(huì)奔潰。測(cè)試在測(cè)試錄屏功能時(shí)立馬停止錄屏,應(yīng)用奔潰,一直找不到原因。直到看到了源碼( API 26 )里的注釋

Android 5.0+ 屏幕錄制實(shí)現(xiàn)的示例代碼

所以為了反正奔潰,在 stop 的時(shí)候捕獲異常,并且置空 MediaRecorder,下次錄屏的時(shí)候再重新生成 MediaRecorder。

最后

由于知識(shí)水平有限,難免有錯(cuò)誤遺漏,歡迎指正!項(xiàng)目地址為 屏幕錄制

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:https://www.jianshu.com/p/7560ce9e4136

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 免费人成黄页在线观看69 | 天天色天天舔 | 久久久久激情免费观看 | 亚洲天堂视频在线播放 | 日韩成片| 放荡的女老板bd中文字幕 | 999热在线精品观看全部 | 欧美特欧美特级一片 | zoz.zzz色| 九色PORNY真实丨国产免费 | 都市后宫小说 | 亚洲欧美日本在线观看 | 色淫影院 | 熟睡中的麻麻大白屁股小说 | 亚洲香蕉伊在人在线观看9 亚洲系列国产系列 | 手机看片国产自拍 | 亚洲经典 | 特黄特色大片免费视频大全 | 久久青青草原综合伊人 | 按摩院已婚妇女中文字幕 | 国产精品亚洲精品观看不卡 | 亚洲午夜精品久久久久久人妖 | 四虎最新免费观看网址 | 嫩草在线视频www免费观看 | 公共场合高h短篇 | 亚洲欧美在线免费 | fuqer日本老师 | 日不卡| 91久久夜色精品国产九色 | 欧美日韩国产一区二区三区欧 | 色综合久久日韩国产 | 久久综久久美利坚合众国 | 青草网在线观看 | 姐姐不~不可以动漫在线观看 | 岛国免费大片 | 公园暴露娇妻小说 | 午夜宅男宅女看在线观看 | 4hc44四虎www在线影院男同 | 亚洲国产麻豆 | 午夜爱爱爱爱爽爽爽视频网站 | 亚洲视频第一页 |