Android应用未声明电话权限却在设置中显示的问题排查求助
检查第三方依赖的隐式权限
这种情况大多是第三方SDK(广告、统计、推送、地图类等)在自身Manifest中声明了电话权限,通过Android的Manifest合并机制被添加到你的应用中。你可以在Android Studio中打开项目的AndroidManifest.xml,切换到底部的Merged Manifest标签,搜索android.permission.CALL_PHONE、android.permission.READ_PHONE_STATE等电话相关权限,查看右侧的"Merge Source"列,就能定位到是哪个依赖库引入的权限。如果不需要该权限,可以在自己的Manifest中移除:<uses-permission android:name="android.permission.CALL_PHONE" tools:node="remove" />核对构建变体的Manifest文件
如果你使用了productFlavors或buildTypes(比如debug/release变体),不同变体对应的src目录下可能存在单独的AndroidManifest.xml,这些文件里可能声明了电话权限。检查src/debug/AndroidManifest.xml、src/release/AndroidManifest.xml或者对应 flavor 目录下的Manifest文件。排查动态权限申请的调用
虽然你没有主动调用,但部分第三方库可能在代码中动态申请电话权限。可以全局搜索项目中的requestPermissions方法,或者搜索电话权限常量(比如Manifest.permission.CALL_PHONE),确认是否有第三方库触发了权限申请。即使未授权,Android系统也会在应用设置中显示该权限选项。Android版本相关特性
- Android 8.0(API 26)之前:权限采用安装时授予机制,只要Manifest中存在权限声明(包括依赖库引入的),应用设置中就会显示该权限且状态为已授予。
- Android 8.0及之后:运行时权限机制下,即使Manifest中存在权限声明(含依赖引入),设置中会显示该权限选项,但默认状态为未授予,直到应用主动申请。如果你的应用在8.0以上设备显示该权限,大概率是依赖库引入了权限声明。
- Android 12(API 31)及更高版本:权限分组逻辑更严格,但电话权限组的显示规则未发生根本性变化,核心还是Manifest中是否存在显式或隐式的权限声明。
内容的提问来源于stack exchange,提问作者Milad Targholi

