在我的应用程序中,我想检查用户是否接到电话(无需获取任何电话详细信息,例如电话号码)。因此,我想像这样在运行时访问片段中危险的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年限制应用程序的电话和SMS访问权限。但是,其他应用程序(如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" />
答案 0 :(得分:1)
需要此权限后,您需要删除android:requiredFeature="false"
。您只想问用户是允许使用许可还是拒绝许可。
当您为某个功能声明
android:required="false"
时,表示 该应用程序倾向于使用该功能(如果存在于 设备,但其设计功能无需指定 功能。