You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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权限——哪怕代码里检测到权限未授予,系统也不会弹出请求弹窗,它会认为你的应用没资格申请这个权限。

解决步骤

  1. 修正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" />
  1. 清理并重新安装应用:卸载当前测试的应用,再重新编译安装,避免旧的Manifest缓存干扰结果。
  2. 高版本Android额外注意:如果你的应用目标是Android 10(API 29)及以上,WRITE_EXTERNAL_STORAGE的权限行为有变化,建议优先使用Scoped Storage访问存储,减少权限相关的问题。

这样修改后,READ_PHONE_STATE的权限弹窗应该就能正常显示了。

内容的提问来源于stack exchange,提问作者Booyaches

火山引擎 最新活动