Android 8和9上未授予可选的危险权限READ_PHONE_STATE?

4
在我的应用程序中,我想要检查用户是否接收到电话(无需获取任何电话详细信息,如电话号码)。因此,我想要在运行时在我的片段中访问危险的 READ_PHONE_STATE 权限,方法如下:
if (ContextCompat.checkSelfPermission(Application.getActiveActivity(), Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED)
{
    ActivityCompat.requestPermissions(Application.getActiveActivity(), new String[]{Manifest.permission.READ_PHONE_STATE}, 1);
}

在我的活动中,我如下处理权限结果:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
{
    if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
    {
        // success, do fancy stuff
    }
    else
    {
        // show alert
    }

    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}

不要忘记在AndroidManifest中添加权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE" android:requiredFeature="false"/>

这个权限标记为非必需,因为该应用程序不仅适用于手机,还适用于平板电脑。

在Android 6和7上,此代码按预期工作。弹出窗口显示要求用户授予访问电话状态的权限。根据用户的选择,在活动的onPermissionsResult()中,grantResults 可以是PERMISSION_GRANTED或PERMISSION_DENIED。到目前为止,一切正常。

我的问题在于,在Android 8和9上行为不同。尽管我在片段中请求了READ_PHONE_STATE权限,但从未显示要求用户授权的弹出窗口。因此,我的活动中onPermissionsResult()的grantResults始终为PERMISSION_DENIED。

我还尝试手动在应用程序设置中激活电话权限,但电话权限甚至没有列出(尽管在Android 6和7上有)。

我读到过Android想要限制2019年应用程序对电话和短信访问的使用。但是像WhatsApp这样的其他应用程序仍然能够使用电话权限。我错过了什么吗?任何形式的帮助将不胜感激。

编辑:
似乎AndroidManifest中的requiredFeature标志引起了问题。当删除时,权限检查就会按预期工作。现在我正在尝试找出如何使用电话权限并支持不支持这些功能的平板设备。

编辑2:
由于@Malv的帮助,我发现我的问题根源是可选的READ_PHONE_STATE权限。我进行了一些研究,发现为了实现我想要的,必须将权限声明为必需。此外,如果电话权限应该是一个可选功能(允许平板电脑也下载该应用程序),则必须使用一个附加参数来指定电信功能为可选项。

以下是我的更新后的AndroidManifest:

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

<uses-feature android:name="android.hardware.telephony" android:required="false" />

可能是Android权限未被请求的重复问题。 - Betty St
1
如果您删除 android:requiredFeature="false" 会发生什么? - Mahdi-Malv
@Malv 这似乎是问题所在。当移除可选的 requiredFeature 后,权限似乎又可以正常工作了。现在我只需要找到一种方法来保持 READ_PHONE_STATE 作为可选权限。非常感谢你的提示! - Petzy Bär
1个回答

3
如果您需要此权限,则需要删除android:requiredFeature="false"。您只需询问用户是否允许使用权限或拒绝它。
根据文档
当您为功能声明android:required="false"时,这意味着应用程序希望在设备上使用该功能,但如果必要,也可以设计为在没有指定功能的情况下运行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接