东北大汉 2023-12-01 10:20 采纳率: 0%
浏览 19

Android录制副屏问题

目前实现的都录制主屏幕的功能,怎么实现录制第二块屏幕显示的内容呢? 副屏就是通过Presentation来实现的Android双屏异显,HDMI连接

  • 写回答

3条回答 默认 最新

  • Leodong. 2023-12-01 10:26
    关注

    该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
    要实现Android录制副屏内容,可以使用MediaProjection API。以下是一个简单的示例:

    1、 首先,需要在AndroidManifest.xml中添加以下权限:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.screen.mirror" />
    <uses-feature android:name="android.hardware.screen.content" />
    <uses-feature android:name="android.hardware.screen.windowing" />
    

    2、 然后,创建一个名为ScreenRecorder的类,继承自MediaProjectionManager.Callback

    import android.hardware.display.DisplayManager;
    import android.hardware.display.VirtualDisplay;
    import android.media.projection.MediaProjection;
    import android.media.projection.MediaProjectionManager;
    import android.os.Bundle;
    import android.view.Surface;
    import android.view.WindowManager;
    
    public class ScreenRecorder extends MediaProjectionManager.Callback {
        private MediaProjectionManager mediaProjectionManager;
        private MediaProjection mediaProjection;
        private VirtualDisplay virtualDisplay;
        private Surface surface;
    
        public ScreenRecorder(MediaProjectionManager mediaProjectionManager) {
            this.mediaProjectionManager = mediaProjectionManager;
        }
    
        public void startRecording() {
            // 请求屏幕录制权限
            if (ActivityCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);
                return;
            }
    
            // 获取屏幕尺寸和密度信息
            DisplayManager displayManager = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE);
            Display display = displayManager.getDefaultDisplay();
            int width = display.getWidth();
            int height = display.getHeight();
            float density = display.getDensity;
    
            // 创建虚拟显示
            virtualDisplay = mediaProjectionManager.createVirtualDisplay("ScreenRecorder", width, height, density, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, null, this);
    
            // 创建Surface并设置到虚拟显示上
            surface = new Surface(virtualDisplay);
    
            // 开始屏幕录制
            mediaProjection.start();
        }
    
        public void stopRecording() {
            // 停止屏幕录制
            if (mediaProjection != null) {
                mediaProjection.stop();
            }
    
            // 销毁虚拟显示
            if (virtualDisplay != null) {
                virtualDisplay.release();
                virtualDisplay = null;
            }
    
            // 销毁Surface
            if (surface != null) {
                surface.release();
                surface = null;
            }
        }
    
        @Override
        public void onRequestError(int errorCode, MediaProjection mediaProjection) {
            // 处理错误情况
        }
    
        @Override
        public void onStop() {
            // 停止录制时调用
        }
    
        @Override
        public void onStart() {
            // 开始录制时调用
        }
    }
    

    3、 在需要录制屏幕的地方,创建一个ScreenRecorder实例,并调用startRecording()方法开始录制:

    ScreenRecorder screenRecorder = new ScreenRecorder(mediaProjectionManager);
    screenRecorder.startRecording();
    

    4、 当不再需要录制屏幕时,调用stopRecording()方法停止录制:

    screenRecorder.stopRecording();
    

    注意:这个示例仅适用于Android 6.0(API级别23)及更高版本。


    如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

    评论

报告相同问题?

问题事件

  • 创建了问题 12月1日