Android 10及以上无需READ_PHONE_STATE权限获取网络连接类型的方法
方案可行性验证及权限说明
你给出的代码方案完全可行,且确实无需申请READ_PHONE_STATE权限,不需要引导用户手动进入应用设置修改权限。
核心逻辑说明
- 两者的权限适用场景完全不同:
READ_PHONE_STATE属于敏感权限,仅在需要获取设备身份标识(IMEI/IMSI)、SIM卡状态、蜂窝网络具体制式(3G/4G/5G细分类型)等敏感信息时才需要使用,Android 10之后确实限制应用自动获取该权限,必须用户手动授予。- 你用到的
ConnectivityManager#getNetworkCapabilities相关API,仅用于判断当前网络的传输类型,不会获取任何敏感信息,谷歌官方明确规定该组API仅需要普通权限ACCESS_NETWORK_STATE,该权限属于安装时自动授予的普通权限,不需要用户手动同意,也不需要动态申请,只需要在AndroidManifest.xml中添加即可:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
兼容优化建议
你代码中使用的getActivityNetwork()是Android 12(API 31)才新增的API,如果你的应用需要兼容Android 10(API 29)、Android 11(API 30)版本,建议替换为getActiveNetwork(),兼容性覆盖更全面。如果仅需要判断网络是WiFi还是蜂窝传输类型,不需要额外权限。
如果后续你需要获取蜂窝网络的具体制式(如准确判断是3G/4G/5G),才需要申请READ_PHONE_STATE权限。
内容的提问来源于stack exchange,提问作者Chief Madog
相关产品推荐
相关产品推荐

