在我的应用程序中,我想检查用户是否接到电话(不需要获取任何电话详细信息,如电话号码)。因此,我想在运行时访问我的片段中危险的分级读电话状态权限,如下所示:

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和android 7。将显示一个弹出窗口,请求用户访问电话状态的权限。根据用户的选择,活动onPermissionsResult()中的GrantResult要么被授予权限,要么被拒绝权限。到目前为止,还不错。
我的问题是android 8和9的行为不同。尽管我在我的片段中请求read_phone_state权限,但从来没有弹出窗口要求用户授予权限。因此,我的活动onPermissionsResult()中的格兰特结果总是被拒绝。
我也试过在应用程序设置中手动激活手机权限,但手机权限甚至没有列出(尽管是android 6和android 7)。
我读到安卓希望在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:requiredFeature="false"。您只需要询问用户是否允许使用该权限或拒绝该权限。
根据documentation
当您为一个特性声明android:required="false"时,它意味着
如果应用程序在
设备,但其设计为在没有指定
功能,如有必要。

07-24 09:45
查看更多