Android 9+上的Mediaprojection问题

时间:2019-07-09 02:40:54

标签: android permissions android-9.0-pie android-mediaprojection androidq

我制作了一个OCR应用程序,该应用程序使用Android mediaprojection制作了屏幕截图并处理了该图像中的文本。除了在Android 9+上,该功能正常。在启动mediaprojeciton时,总是会弹出一个窗口,提示可能会记录的敏感数据,以及一个取消或开始记录的按钮。我如何才能实现此窗口仅显示一次?

我试图通过创建两个额外的私有静态变量来存储它的意图和结果数据来阻止它弹出,并在其不为null的情况下重新使用它。但这没有用(在另一篇文章中了解了此方法)。

popup window

//初始化MP

mProjectionManager =(MediaProjectionManager)getSystemService(Context.MEDIA_PROJECTION_SERVICE);

//启动MediaProjection

private void startProjection(){         startActivityForResult(mProjectionManager.createScreenCaptureIntent(),REQUEST_CODE);     }

// OnActivityResult  受保护的void onActivityResult(最终int requestCode,最终int resultCode,最终Intent数据){

    if (requestCode == 100) {
        if(mProjectionManager == null) {
            cancelEverything();
            return;
        }

        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {

                if(mProjectionManager != null)
                sMediaProjection = mProjectionManager.getMediaProjection(resultCode, data);
                else
                    cancelEverything();
                if (sMediaProjection != null) {
                    File externalFilesDir = getExternalFilesDir(null);
                    if (externalFilesDir != null) {
                        STORE_DIRECTORY = externalFilesDir.getAbsolutePath() + "/screenshots/";

                        File storeDirectory = new File(STORE_DIRECTORY);
                        if (!storeDirectory.exists()) {
                            boolean success = storeDirectory.mkdirs();
                            if (!success) {
                                Log.e(TAG, "failed to create file storage directory.");
                                return;
                            }
                        }
                    } else {
                        Log.e(TAG, "failed to create file storage directory, getExternalFilesDir is null.");
                        return;
                    }

                    // display metrics
                    DisplayMetrics metrics = getResources().getDisplayMetrics();
                    mDensity = metrics.densityDpi;
                    mDisplay = getWindowManager().getDefaultDisplay();

                    // create virtual display depending on device width / height
                    createVirtualDisplay();

                    // register orientation change callback
                    mOrientationChangeCallback = new OrientationChangeCallback(getApplicationContext());
                    if (mOrientationChangeCallback.canDetectOrientation()) {
                        mOrientationChangeCallback.enable();
                    }

                    // register media projection stop callback
                    sMediaProjection.registerCallback(new MediaProjectionStopCallback(), mHandler);
                }



            }
        }, 2000);


        }

}

我的代码在低于Android 9的Android版本上运行正常。在较旧的android版本上,我可以选择保留授予录制权限的决定,并且该决定永远不会再出现。那我可以在Android 9中做什么?

在此先感谢您对每个想法的满意:)

1 个答案:

答案 0 :(得分:2)

问题是我在打电话 startActivityForResult(mProjectionManager.createScreenCaptureIntent(), REQUEST_CODE); 每次都是不必要的(createScreenCaptureIntent()会进入对话框窗口,要求用户进行交互) 我的解决方案使对话框仅出现一次(如果关闭了应用程序,它将再次请求许可)。 我要做的就是制作Intent和int类型的附加私有静态变量。

private static Intent staticIntentData; private static int staticResultCode;

在“活动”结果中,我为这些变量分配了传递的结果代码和意图:

if(staticResultCode == 0 && staticIntentData == null) { sMediaProjection = mProjectionManager.getMediaProjection(resultCode, data); staticIntentData = data; staticResultCode = resultCode;                        } else { sMediaProjection = mProjectionManager.getMediaProjection(staticResultCode, staticIntentData)}; }

每次调用startprojection方法时,我都会检查它们是否为空:

if(staticIntentData == null) startActivityForResult(mProjectionManager.createScreenCaptureIntent(), REQUEST_CODE); else captureScreen();

如果为null,它将请求权限,否则,将使用静态意图数据和静态int结果代码开始投影,因此不需要再次请求该权限,只需重用活动结果中得到的内容即可。

sMediaProjection = mProjectionManager.getMediaProjection(staticResultCode, staticIntentData);

就这么简单!现在,每次您使用该应用程序时,它只会显示一次。我想这就是Google想要的,因为在该对话框中没有像以前的android版本一样保留决策复选框。