天天看點

android 實作錄屏功能(懸浮窗)

前言:網上關于錄屏的介紹已經很多了,本篇文章也不過多介紹詳細,主要是闡述其流程原理,輸出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體驗

android 實作錄屏功能(懸浮窗)

代碼基于ScreenRecordHelper封裝

如果覺得可以點個star吧