API 级别 29 - MediaProjection 始终请求许可

Posted

技术标签:

【中文标题】API 级别 29 - MediaProjection 始终请求许可【英文标题】:API Level 29 - MediaProjection is always requesting permission 【发布时间】:2020-03-06 13:22:05 【问题描述】:

直到 android API28 请求媒体投影服务时,Android 才允许用户通过选中“不再显示”复选框授予访问权限一次。这样每当应用想要使用媒体投影服务时,访问权限就已经被授予了。

在 android AP29 中,对话框发生了变化,该选项不再存在。

可以做些什么来让用户只授予应用程序一次使用媒体投影的访问权限?谢谢。

【问题讨论】:

【参考方案1】:

问题是我在打电话

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 版本那样保留决策复选框

【讨论】:

以上是关于API 级别 29 - MediaProjection 始终请求许可的主要内容,如果未能解决你的问题,请参考以下文章

如何在expo react native App中将api级别29更改为30

无法打开相机意图。 queryIntentActivities 在 api 级别 30 返回一个空列表,但在级别 29 中找到结果。发生了啥变化?

API 级别 29 - MediaProjection 始终请求许可

android studio 中的 GPS 状态 - API 级别 29

Google Play Target API 级别要求

API 级别低于 21 的状态栏颜色不变