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

问题描述 投票:3回答:1

在我的应用程序中,我想检查用户是否接到电话(无需获取任何电话详细信息,如电话号码)。因此,我希望在运行时访问我的片段中危险的额定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 user-permissions
1个回答
1
投票

如果您需要此权限,则需要删除android:requiredFeature="false"。您只想询问用户是允许使用权限还是拒绝权限。

根据documentation

当您为某个功能声明android:required="false"时,这意味着该应用程序更喜欢使用该功能(如果存在于设备上),但如果需要,它可以在没有指定功能的情况下运行。

© www.soinside.com 2019 - 2024. All rights reserved.