在我的应用程序中,我想要检查用户是否接收到电话(无需获取任何电话详细信息,如电话号码)。因此,我想要在运行时在我的片段中访问危险的 READ_PHONE_STATE 权限,方法如下:
在我的活动中,我如下处理权限结果:
不要忘记在AndroidManifest中添加权限:
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:requiredFeature="false"
会发生什么? - Mahdi-MalvrequiredFeature
后,权限似乎又可以正常工作了。现在我只需要找到一种方法来保持 READ_PHONE_STATE 作为可选权限。非常感谢你的提示! - Petzy Bär