必须在androidmanifest.xml中声明权限,否则运行时申请会抛securityexception;仅声明不申请则功能静默失效,如定位返回null。

AndroidManifest.xml 里加权限,不写就根本没用
Android 应用想用某项敏感能力(比如定位、读存储、开摄像头),光在代码里调 checkSelfPermission() 或 requestPermissions() 没用——系统压根不会理你。必须先在 AndroidManifest.xml 里用 <uses-permission></uses-permission> 显式声明,这是硬性前提,缺一不可。
- 没声明就调运行时申请?
requestPermissions()直接抛SecurityException,Logcat 里会看到 “Permission denied” - 声明了但没在代码里申请?功能静默失效,比如
ACCESS_FINE_LOCATION声明了却没运行时请求,FusedLocationProviderClient返回的Location永远是null - 只在低版本(API
哪些权限要声明 + 运行时再申请?看危险等级
Android 把权限分三类:普通权限(install-time)、危险权限(runtime)、特殊权限(如 SYSTEM_ALERT_WINDOW)。只有危险权限才需要「清单声明 + 运行时弹窗」两步走。常见危险权限包括:
-
ACCESS_FINE_LOCATION/ACCESS_COARSE_LOCATION(定位) -
READ_EXTERNAL_STORAGE/WRITE_EXTERNAL_STORAGE(存储,Android 10+ 推荐用分区存储,但兼容旧设备仍需声明) -
CAMERA/RECORD_AUDIO(音视频) -
READ_CONTACTS/READ_SMS(通讯录、短信)
普通权限如 INTERNET、ACCESS_NETWORK_STATE,只要声明,安装即授,不用代码申请。
别漏掉 android:exported,尤其 Android 12+ 强制要求
从 Android 12(API 31)起,所有含 <intent-filter></intent-filter> 的 <activity></activity>、<service></service>、<receiver></receiver> 必须显式设置 android:exported。否则安装直接失败,报错:Installation failed due to: 'Failed to parse APK' 或更具体的 android:exported needs to be explicitly specified。
- 主 Activity(带
LAUNCHER)通常设为android:exported="true" - 内部使用的 BroadcastReceiver(如监听本地事件)建议设为
android:exported="false" - 忘了加?Gradle 构建可能不报错,但真机安装必挂,模拟器也一样
硬件相关权限要配 <uses-feature></uses-feature>,否则上架被拒或装不上
像 CAMERA、BLUETOOTH 这类权限隐含硬件依赖。如果你的应用只是“可选使用相机”,不是非它不可,就必须同步加 <uses-feature android:name="android.hardware.camera" android:required="false"></uses-feature>。
- 不加且
required="true"(默认值)→ Google Play 会把你的应用过滤掉,没有摄像头的设备(如部分平板、Chromebook)根本搜不到 - 不加且用户手机真没该硬件 → 安装失败,提示 “This app is not compatible with your device”
- 加了
required="false"后,记得在代码里用getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)主动检测,再决定是否启用相关 UI
权限不是越多越好,每一条 <uses-permission></uses-permission> 都得有明确用途,而且得经得起用户质疑——你在哪一步真正用到了它?漏掉声明、错配 exported、忽略硬件适配,这三个点,一个没踩准,轻则功能白写,重则发不出包。










