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.
在我的应用程序中,我想检查用户是否收到了 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.