前言:網上關于錄屏的介紹已經很多了,本篇文章也不過多介紹詳細,主要是闡述其流程原理,輸出demo,該demo樣式仿照小米自帶的系統錄屏
1.如何錄屏
Android中在5.0以上的版本中系統已經提供了螢幕擷取的相關類。整個錄屏的實作主要涉及到下面4個類
MediaProjectionManager 主要提供捕獲螢幕的Intent()
和MediaProjection
MediaProjection 擷取媒體投影
MediaRecorder 錄制視訊
VirtualDisplay 這個了解起來有點抽象,可以了解成一個虛拟的螢幕視窗主要
用來擷取螢幕的投影
錄制流程也很簡單,系統已經為我們提供相關的api,我們隻需要處理錄制參數和最後的錄制檔案就行
2.代碼
為了在應用中錄制友善,将錄制封裝程了一個工具類,我們使用隻需要在錄制螢幕所承載的activity中使用就行了
class MainActivity : AppCompatActivity(), ScreenStateListener {
private var screenRecorderBuild: ScreenRecorderBuild? = null
@RequiresApi(Build.VERSION_CODES.M)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//這裡需要申請權限
rxPermissions.request(
Manifest.permission.MODIFY_AUDIO_SETTINGS,
Manifest.permission.RECORD_AUDIO,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.SYSTEM_ALERT_WINDOW,
Manifest.permission.ACCESS_NOTIFICATION_POLICY
).subscribe {
/**
*可以直接 screenRecorderBuild = *ScreenRecorderBuild.Builder()
.setActivity(this)
.build()
**/
screenRecorderBuild = ScreenRecorderBuild.Builder()
.setActivity(this)
.setFps(Utils.getFps())
.setBitRate(Utils.getBitRate())
.setStateListener(this)
.build()
Log.i("ddddd", "dddddd")
}
}
@SuppressLint("NewApi")
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
data?.let {
Log.e("MainActivity","onActivityResult")
screenRecorderBuild?.onActivityResult(requestCode, resultCode, data)
}
}
然後調用
startRecord() //開始錄制
stopRecord()//停止錄制
resume()//繼續錄制
pause()//暫停錄制
錄制狀态監聽實作
ScreenStateListener
就行
public interface ScreenStateListener {
/**
* 錄制中
*/
void recording();
/**
* 暫停中
*/
void pause();
/**
* 錄制結束
* @param path 檔案位址
*/
void stop(String path);
/**
* 異常
* @param msg 異常提示
*/
void error(String msg);
}
相關設定
screenRecorderBuild = ScreenRecorderBuild.Builder()
.setActivity(this)
.setFps(Utils.getFps())//設定fps 預設24fps
.setBitRate(Utils.getBitRate())//設定視訊編碼比特率1Mbps、5Mbps。//預設5Mbps
.setStateListener(this) //設定錄制監聽
.setWidth(1080)//寬 預設系統
.setHeight(1980)//高 預設系統
.setIsAudioVoice(true)//true有聲 false無聲
.build()
3.注意
有幾點需要注意!如果是通過懸浮窗控制錄制的,并且在錄制結束之後要繼續開始錄制那麼
ScreenRecorderBuild
要放在1像素的承載activity,在接受到
onActivityResult
回調時在退出到背景!否者處于背景狀态下的activity是無法收到onActivityResult回調
二是錄制過程錄制的是整個螢幕上所承載的界面,也就是說懸浮窗也要被錄制,系統自帶的不錄制懸浮窗是在framework層修改代碼了的
最後
demo
apk體驗

代碼基于ScreenRecordHelper封裝
如果覺得可以點個star吧