当我的应用程序处于后台时,是否可以使用媒体记录器服务并记录我的屏幕?

如何解决当我的应用程序处于后台时,是否可以使用媒体记录器服务并记录我的屏幕?

当我的应用程序处于后台时,我正在尝试从我的手机中截取屏幕截图。使用服务。

我在我的服务 onCreate 中使用它在屏幕上设置了一个按钮。

 manager3 = ((WindowManager) getApplicationContext()
                .getSystemService(Context.WINDOW_SERVICE));

        WindowManager.LayoutParams params3 = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.WRAP_CONTENT,WindowManager.LayoutParams.WRAP_CONTENT,WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,PixelFormat.TRANSLUCENT);

        dialogView3 = View.inflate(getBaseContext(),R.layout.dialog_screenshoot3_full,null);
        iv_photo1 = dialogView3.findViewById(R.id.iv_photo1);
        iv_photo1.setonClickListener(v -> {

            if(staticResultCode == 0 && staticIntentData == null){

                Intent dialogIntent = new Intent(Service_screen_shot.this,ScreenShotActivity.class);
                dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(dialogIntent);
            } else {

                toogleScreenShare();

            }



        });

        params3.gravity = Gravity.TOP | Gravity.END;
        params3.x = 5;   //x position
        params3.y = 165;   //y position
        assert manager3 != null;
        manager3.addView(dialogView3,params3);


 bronActivityResult = new broadcastReceiver() {
            @Override
            public void onReceive(Context context,Intent intent) {

                Toast.makeText(context,"HELLO",Toast.LENGTH_SHORT).show();

                staticIntentData = intent.getParcelableExtra("data");
                staticResultCode = -1;

                toogleScreenShare();
                //Toast.makeText(context,"staticIntentData: " + staticIntentData,Toast.LENGTH_SHORT).show();

            }
        };

        IntentFilter brintent = new IntentFilter();
        brintent.addAction("brActionFloatingServiceOnActivityResult");
        getApplicationContext().registerReceiver(bronActivityResult,brintent);


        wm = (WindowManager) getSystemService(WINDOW_SERVICE);
        final displayMetrics displayMetrics = new displayMetrics();
        wm.getDefaultdisplay().getMetrics(displayMetrics);
        mScreenDensity = displayMetrics.densityDpi;
        disPLAY_HEIGHT = displayMetrics.heightPixels;
        disPLAY_WIDTH = displayMetrics.widthPixels;

接下来是我的 mediarecorder 代码

 @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    private void toogleScreenShare() {
        initRecorder();
        recordScreen();
    }

    private void initRecorder() {
        
        try {

            CamcorderProfile cpHigh = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
            mediaRecorder = new MediaRecorder();
            mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
            mediaRecorder.setoutputFormat(MediaRecorder.OutputFormat.THREE_GPP);

            screenShotUri = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + new StringBuilder("/screenshot").append(".mp4").toString();

            mediaRecorder.setoutputFile(screenShotUri);
            mediaRecorder.setVideoSize(disPLAY_WIDTH,disPLAY_HEIGHT);
            mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
            mediaRecorder.setVideoEncodingBitRate(cpHigh.videoBitRate);
            mediaRecorder.setVideoFrameRate(cpHigh.videoFrameRate);

            int rotation = wm.getDefaultdisplay().getRotation();
            int orientation = ORIENTATION.get(rotation + 90);
            mediaRecorder.setorientationHint(orientation);
            mediaRecorder.prepare();

        } catch (IOException e) {
            e.printstacktrace();
            Log.d("ExceptionOccured","" + e.getMessage());
        }
    }

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    private void recordScreen() {

        //Toast.makeText(this,"Class recordScreen: ",Toast.LENGTH_SHORT).show();
        mediaprojectionmanager = (mediaprojectionmanager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);

        mediaProjection = mediaprojectionmanager.getMediaProjection(staticResultCode,staticIntentData);


        if (mediaProjection != null) {

            //virtualdisplay = createVirtualdisplay();
            mediaRecorder.start();
            //onBackpressed();
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    mediaRecorder.stop();
                    mediaRecorder.reset();
                    //stopRecordScreen();
                    //destroyMediaProjection();
                    new Handler().postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            getPathScreenShot(screenShotUri);
                        }
                    },1000);
                }
            },5000);
        }
    }

    public void getPathScreenShot(String filePath) {

        MediaMetadataRetriever med = new MediaMetadataRetriever();
        med.setDataSource(filePath);
        Bitmap bmp = med.getFrameAtTime(2 * 1000000,MediaMetadataRetriever.OPTION_CLOSEST);
        String myPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + new StringBuilder("/screenshot694").append(".jpeg").toString();

        File myDir = new File(myPath);
        myDir.mkdirs();

        if (myDir.exists())
            myDir.delete();
        try {
            FileOutputStream out = new FileOutputStream(myDir);
            bmp.compress(Bitmap.CompressFormat.JPEG,100,out);
            out.flush();
            out.close();
        } catch (Exception e) {
            e.printstacktrace();
        }



        Toast.makeText(this,"PHOTO PATH: " + myPath,Toast.LENGTH_SHORT).show();
    }

服务好,按钮好,我可以去活动接受第一次录屏的权限。 我发回数据和 resultCode 来初始化媒体投影。 但是 mediarecorder 没有启动。

我收到此错误

04-05 15:10:51.815:E/MediaRecorder(15709):停止失败:-1007

有什么解决办法吗?? Activity 中的相同代码完美运行。但是任何时候我想要拍照都会出现在活动中,而且我无法在我的应用程序之外拍照。 // 尝试不使用布局,也使用透明主题,但它显示了我只启动我的应用程序和服务的主要活动。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?