API 29 级 - MediaProjection 一直在请求许可

API Level 29 - MediaProjection is always requesting permission

直到 Android API28 在请求媒体投影服务时 android 允许用户通过选择“不再显示”来授予访问权限一次-盒子。因此,每次应用程序想要使用媒体投影服务时,访问权限都已被授予。

在 android AP29 中,对话框已更改,此选项不再存在。

如何才能让用户只授予应用程序一次访问权限以使用媒体投影?谢谢。

嗯,问题是我在打电话

startActivityForResult(mProjectionManager.createScreenCaptureIntent(), REQUEST_CODE); 

每次,这不是必需的(createScreenCaptureIntent() 导致请求用户交互的对话框 window)我的解决方案使对话框只出现一次(如果应用程序关闭,它将请求一次权限再次)。我所要做的就是制作 Intent 和 int 类型的附加私有静态变量。

private static Intent staticIntentData;
private static int staticResultCode;

在 Activity 结果上,我将传递的结果代码和意图分配给这些变量:

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 resultcode 开始投影,因此不需要再次请求该权限,只需重用您在 [=29 中获得的内容=] 结果.

sMediaProjection = mProjectionManager.getMediaProjection(staticResultCode, staticIntentData);

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

那样保留决定复选框