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

Optional, dangerous permission READ_PHONE_STATE not granted on Android 8 and 9?

在我的应用程序中,我想检查用户是否收到了 phone 电话(不需要获取任何 phone 详细信息,例如 phone 号码)。因此,我想在运行时访问我的片段中危险的 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);
}

在我的activity中我是这样处理权限结果的:

@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"/>

(该权限被标记为不需要,因为该应用不仅可以在 phone 上运行,而且还可以在平板电脑上运行)

此代码按预期用于 Android 6 和 7。显示一个弹出窗口,询问用户是否允许访问 phone 状态。根据用户的选择,activity 的 onPermissionsResult() 中的 grantResults 是 PERMISSION_GRANTED 或 PERMISSION_DENIED。到目前为止,还不错。

我的问题是 Android 8 和 9 的行为不同。虽然我在我的片段中请求 READ_PHONE_STATE 权限,但从来没有弹出窗口询问用户授予他们。因此,我的 activity 的 onPermissionsResult() 中的 grantResults 总是 PERMISSION_DENIED。

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

我了解到 Android 想在 2019 年限制应用的 phone 和 SMS 访问权限。但是 WhatsApp 等其他应用仍然能够使用 phone允许。有什么我想念的吗?任何形式的帮助将不胜感激。

编辑:
似乎 AndroidManifest 中的 requiredFeature 标志在这里引起了麻烦。删除后,权限检查会正常工作。现在我正在尝试找出如何使用 phone 权限并支持不具备这些功能的平板电脑设备。

编辑 2:
感谢@Malv,我发现问题的根源是可选的 READ_PHONE_STATE 权限。我做了一些研究,发现为了实现我想要的,我必须根据需要声明许可。此外,如果 phone 权限应该是一个可选功能(也允许平板电脑下载应用程序),我必须使用一个额外的参数,将电话功能指定为可选。

这是我更新的 Android清单:

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

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

由于您需要此权限,因此您需要删除 android:requiredFeature="false"。您只想询问用户是否允许使用该权限或拒绝它。

根据 documentation:

When you declare android:required="false" for a feature, it means that the application prefers to use the feature if present on the device, but that it is designed to function without the specified feature, if necessary.