天天看点

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吧