一、这是什么
<uses-featureandroid:name="android.hardware.camera"/><uses-feature>用于在AndroidManifest.xml中声明应用需要用到的硬件或软件特性(功能)。
字面拆解
| 部分 | 含义 |
|---|---|
uses | 使用 |
feature | 特性、功能(如相机、GPS、蓝牙等) |
| 合起来 | “我要用(某个)硬件/软件特性” |
核心含义:告诉系统和应用商店:“我这个应用会用到 XX 硬件/功能。”
二、为什么需要它(核心目的)⭐
这是理解<uses-feature>的关键。它的主要作用是"筛选设备"。
核心目的:应用商店过滤
你的App需要相机功能 ↓ 声明 <uses-feature android:name="android.hardware.camera" /> ↓ Google Play 等商店会自动过滤: ↓ 没有相机的设备 → 看不到/不能安装你的App为什么要这样做
| 目的 | 说明 |
|---|---|
| 避免装了没法用 | 没相机的设备装了拍照App,用户体验极差 |
| 减少差评 | 防止用户装了发现不能用而给差评 |
| 精准投放 | 只让有对应硬件的用户看到你的App |
💡 打比方:
<uses-feature>就像招聘启事上写"需要有驾照"。没驾照的人(没对应硬件的设备)就自动被筛掉了,不会来应聘(安装)。
三、与<uses-permission>的关键区别 ⭐
这两个经常一起出现,但作用完全不同,很容易混淆。
对比总览
| 对比项 | <uses-permission> | <uses-feature> |
|---|---|---|
| 作用 | 申请使用权限 | 声明需要硬件/特性 |
| 面向 | 系统 + 用户 | 应用商店(过滤设备) |
| 回答的问题 | “我能不能用?” | “这设备有没有?” |
| 例子 | “允许我用相机” | “我需要设备有相机” |
| 不满足的后果 | 功能被拒绝 | 设备被商店过滤 |
用一个例子说清楚
做一个拍照App,需要两个都写:
<!-- permission:申请"使用相机"的权限 --><uses-permissionandroid:name="android.permission.CAMERA"/><!-- feature:声明"需要设备有相机硬件" --><uses-featureandroid:name="android.hardware.camera"/>理解:
permission→ “请允许我用相机”(要不要给我钥匙)feature→ “这设备得有相机才行”(这房子得有这个房间)
四、基本使用
位置:manifest 内、application 外
<?xml version="1.0" encoding="utf-8"?><manifestxmlns:android="http://schemas.android.com/apk/res/android"package="com.example.myapp"><!-- 权限声明 --><uses-permissionandroid:name="android.permission.CAMERA"/><!-- 特性声明 --><uses-featureandroid:name="android.hardware.camera"/><application...>...</application></manifest>五、核心属性:android:required⭐(重点)
这是<uses-feature>最重要的属性,决定这个特性是**“必须"还是"可选”**。
两种取值
android:required="true"<!-- 必须有(默认值) -->android:required="false"<!-- 可选,没有也能装 -->对比理解
| 取值 | 含义 | 商店行为 |
|---|---|---|
true(默认) | 设备必须有这个特性 | 没有的设备无法安装 |
false | 有最好,没有也能装 | 所有设备都能安装 |
场景对比
场景 1:required=“true”(相机是核心功能)
<uses-featureandroid:name="android.hardware.camera"android:required="true"/>适用:相机App、扫码App等——没相机就完全没用。
结果:没相机的设备装不了(商店直接过滤)。
场景 2:required=“false”(相机是可选功能)⭐
<uses-featureandroid:name="android.hardware.camera"android:required="false"/>适用:社交App——主要功能是聊天,拍照只是附加功能。
结果:
- 所有设备都能装(包括没相机的)
- 没相机的设备装了后,其他功能正常用,只是拍照用不了
required=“false” 时的代码处理
因为设备可能没有这个特性,用之前要先检查:
// 检查设备是否有相机if(getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){// 有相机,显示拍照按钮openCamera();}else{// 没相机,隐藏拍照功能hideCameraButton();}关键:用required="false"时,一定要在代码里判断特性是否存在,避免崩溃。
六、常见特性速查表
硬件特性(hardware)
| 特性名 | 含义 |
|---|---|
android.hardware.camera | 相机 |
android.hardware.camera.front | 前置相机 |
android.hardware.bluetooth | 蓝牙 |
android.hardware.location.gps | GPS定位 |
android.hardware.microphone | 麦克风 |
android.hardware.sensor.accelerometer | 加速度传感器 |
android.hardware.telephony | 电话功能 |
android.hardware.wifi | WiFi |
android.hardware.nfc | NFC |
android.hardware.fingerprint | 指纹识别 |
软件特性(software)
| 特性名 | 含义 |
|---|---|
android.software.webview | WebView |
android.software.sip.voip | 网络电话 |
写法示例:
<uses-featureandroid:name="android.hardware.bluetooth"/><uses-featureandroid:name="android.hardware.location.gps"/>七、权限自动关联特性(隐式声明)⭐
重要机制:声明某些权限时,系统会自动隐式添加对应的 feature 需求。
举例
<!-- 你只声明了相机权限 --><uses-permissionandroid:name="android.permission.CAMERA"/>系统自动认为:你需要相机硬件,隐式添加了required="true"的相机特性!
后果:没相机的设备会被过滤,即使你没写 uses-feature。
如何避免这个"坑"
如果相机只是可选功能,要显式声明required="false"来覆盖:
<uses-permissionandroid:name="android.permission.CAMERA"/><!-- 显式声明为可选,覆盖系统的默认true --><uses-featureandroid:name="android.hardware.camera"android:required="false"/>💡 这是个常见坑:明明只想要个可选功能,结果因为申请了权限,导致大量设备装不了App。
八、使用后的表现
从开发者角度
- 声明后,代码功能不变(feature 本身不"授予"什么)
- 主要影响发布到商店后的分发范围
从商店/用户角度
required="true" 的特性 ↓ 不满足的设备 → 商店里搜不到你的App / 显示"不兼容" ↓ 满足的设备 → 正常显示、可安装九、实战完整示例
做一个"带拍照功能的社交App":
<manifest...><!-- 联网:核心功能必需 --><uses-permissionandroid:name="android.permission.INTERNET"/><!-- 相机权限:拍照要用 --><uses-permissionandroid:name="android.permission.CAMERA"/><!-- 相机特性:设为可选,让没相机的设备也能装 --><uses-featureandroid:name="android.hardware.camera"android:required="false"/><application...>...</application></manifest>配套代码:
// 运行时检查相机是否存在if(getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){showCameraFeature();// 有相机,显示拍照}else{hideCameraFeature();// 没相机,隐藏拍照,其他功能正常}十、核心总结
<uses-feature>声明应用需要的硬件/软件特性(相机、GPS、蓝牙等)。核心目的是"过滤设备":让应用商店只把App分发给有对应硬件的设备。
与 permission 的区别:
- permission → 申请使用权限(能不能用)
- feature → 声明需要硬件(设备有没有)
关键属性
required:true(默认)→ 必须有,否则设备被过滤false→ 可选,所有设备都能装(但要代码检查)
权限自动关联特性的坑:声明相机权限会隐式要求相机硬件,需显式设
required="false"覆盖。required=“false” 必配检查代码:用
hasSystemFeature()判断特性是否存在。记忆口诀:“feature管硬件、permission管权限;required真必须、假则可选装;权限带特性、注意别踩坑”。