READ_PHONE_STATE权限弹窗不显示问题排查与解决
READ_PHONE_STATE权限弹窗不显示?我来帮你排查解决!
我之前也踩过类似的坑,先梳理下你遇到的问题:你通过checkPermissions()方法请求两个权限,明明调试时看到missingPermisions.size()是2(说明两个权限都未被授予),但只有WRITE_EXTERNAL_STORAGE的弹窗正常弹出,单独请求READ_PHONE_STATE时依然没反应,而且你已经在Manifest里声明了这个权限。
先贴出你的代码和Manifest配置,方便大家定位问题:
权限请求代码
public void checkPermissions() { if (Build.VERSION.SDK_INT >= 23) { ArrayList<String> missingPermisions = new ArrayList<>(); if (checkSelfPermission(android.Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { missingPermisions.add(android.Manifest.permission.READ_PHONE_STATE); } if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { missingPermisions.add(android.Manifest.permission.WRITE_EXTERNAL_STORAGE); } if (missingPermisions.size() > 0) { String[] permissions = missingPermisions.toArray(new String[missingPermisions.size()]); ActivityCompat.requestPermissions(this, permissions, PERMISSIONS_REQUEST); } } }
你当前的Manifest权限声明
<permission android:name="android.permission.INTERNET" /> <permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <permission android:name="android.permission.READ_PHONE_STATE" /> <permission android:name="android.permission.MEDIA_CONTENT_CONTROL" />
问题根源
你这里犯了一个容易忽略的细节错误:Manifest里的权限声明标签用错了!
<permission>标签是用来自定义权限的(比如你想让其他应用访问你的组件时需要的权限),而声明你的应用需要申请的系统权限,必须用<uses-permission>标签。
因为用了错误的标签,系统根本不识别你的应用需要READ_PHONE_STATE权限——哪怕代码里检测到权限未授予,系统也不会弹出请求弹窗,它会认为你的应用没资格申请这个权限。
解决步骤
- 修正Manifest的权限标签:把所有
<permission>替换成<uses-permission>,修改后的配置如下:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL" />
- 清理并重新安装应用:卸载当前测试的应用,再重新编译安装,避免旧的Manifest缓存干扰结果。
- 高版本Android额外注意:如果你的应用目标是Android 10(API 29)及以上,
WRITE_EXTERNAL_STORAGE的权限行为有变化,建议优先使用Scoped Storage访问存储,减少权限相关的问题。
这样修改后,READ_PHONE_STATE的权限弹窗应该就能正常显示了。
内容的提问来源于stack exchange,提问作者Booyaches




