3、开发环境准备:Android Studio 安装与配置、创建第一个带传感器的项目、在AndroidManifest.xml中声明传感器权限
好,咱们正式开始动手了。这一章说白了就是「把枪擦亮,子弹上膛」。你想想看,再厉害的工程师,没有顺手的工具也白搭。我个人习惯是把开发环境搞得干干净净,这样后面调试传感器的时候,少很多莫名其妙的坑。
3.1 Android Studio 安装与配置
Android Studio 是官方 IDE,没得选。我见过有人用 Eclipse 配 ADT 搞传感器开发,嗯……那都是上古时代的事了。现在老老实实用 Android Studio 吧。
3.1.1 下载与安装
去官网下载最新稳定版就行。注意几点:
- JDK 版本:Android Studio 现在自带 JDK 11,不用额外装。但我遇到过用 JDK 8 编译传感器 HAL 层代码出问题的情况,所以建议直接用自带的。
- SDK 版本:安装时勾选 Android 10 (API 29) 或更高版本。距离传感器从 API 1 就有了,但新设备上有些行为变了,我后面会讲。
- 模拟器:如果你没有真机,可以创建带传感器的模拟器。但说实话,模拟器的距离传感器数据是假的,我建议你搞一台真机。
3.1.2 配置 SDK 和 NDK
打开 Settings → Appearance & Behavior → System Settings → Android SDK。你需要确保安装了这些:
| 组件 | 说明 | 我的建议 |
|---|---|---|
| SDK Platforms | 选择你目标设备的 API 级别 | 至少 API 29,兼容 API 23+ |
| SDK Tools | Android SDK Build-Tools 30+ | 用最新稳定版 |
| NDK | 如果要做底层传感器驱动开发 | 建议装 21.4.x 版本 |
为什么要提 NDK?因为有些高级传感器操作(比如直接读取 /dev/input/event 节点)需要 C/C++ 代码。不过咱们课程前期用 Java/Kotlin 就够了。
3.2 创建第一个带传感器的项目
打开 Android Studio,点「New Project」。选 Empty Activity,项目名我建议叫 DistanceSensorDemo。包名用 com.example.sensor 就行。
语言选 Java 还是 Kotlin?我个人更推荐 Kotlin,因为空安全特性在处理传感器回调时特别有用。但如果你只会 Java,也没问题,代码我两种都会给。
3.2.1 项目结构一览
创建完成后,你会看到这样的结构:
DistanceSensorDemo/
├── app/
│ ├── src/
│ │ ├── main/
│ │ │ ├── java/com/example/sensor/
│ │ │ │ └── MainActivity.java
│ │ │ ├── res/
│ │ │ └── AndroidManifest.xml
│ │ └── test/
│ └── build.gradle
├── build.gradle
└── settings.gradle
嗯,这里要注意:AndroidManifest.xml 是我们接下来要重点操作的文件。传感器权限声明就在这里面。
3.2.2 添加传感器依赖(其实不需要)
有个常见的误解:很多人以为使用传感器需要额外导入什么库。其实不用。Android 框架自带的 android.hardware.Sensor 和 SensorManager 就在 SDK 里,直接就能用。
不过,如果你要做更高级的传感器融合(比如距离+光线传感器联合判断),可以考虑用 Google 的 androidx.car.sensor 库。但咱们入门阶段,完全不需要。
3.3 在 AndroidManifest.xml 中声明传感器权限
好,重点来了。距离传感器需要什么权限?
答案是:普通传感器不需要运行时权限。
你可能会问:「那为什么还要声明?」
其实,大多数传感器(距离、加速度、陀螺仪等)在 Android 中属于 普通权限,系统会自动授予。但有些传感器(比如心率、指纹)需要运行时权限。距离传感器属于前者。
不过,我建议你还是显式声明一下,原因有二:
- 代码可读性:别人看你的 Manifest,一眼就知道你用了哪些传感器。
- Google Play 合规:如果你的 App 声明了某个传感器,但 Manifest 里没写,审核时可能会被标记。
3.3.1 声明方式
打开 AndroidManifest.xml,在 <manifest> 标签内添加:
<uses-feature
android:name="android.hardware.sensor.proximity"
android:required="true" />
这里 required="true" 表示你的 App 必须 在带距离传感器的设备上才能运行。如果设为 false,则没有传感器的设备也能安装,但你需要代码里做兼容处理。
required 设成了 true,结果测试机是一台平板,没有距离传感器,App 直接闪退。后来我改成 false,并在代码里用 hasSystemFeature() 做检查,才解决问题。
3.3.2 完整 Manifest 示例
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.sensor">
<!-- 声明使用距离传感器 -->
<uses-feature
android:name="android.hardware.sensor.proximity"
android:required="false" />
<application
android:allowBackup="true"
android:label="距离传感器Demo"
android:supportsRtl="true"
android:theme="@style/Theme.DistanceSensorDemo">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
你看,其实就多了一行 <uses-feature>。简单吧?
3.3.3 其他传感器权限速查表
为了方便你以后开发,我整理了一个常用传感器权限表:
| 传感器类型 | Feature 名称 | 是否需要运行时权限 |
|---|---|---|
| 距离传感器 | android.hardware.sensor.proximity | 否 |
| 光线传感器 | android.hardware.sensor.light | 否 |
| 加速度计 | android.hardware.sensor.accelerometer | 否 |
| 陀螺仪 | android.hardware.sensor.gyroscope | 否 |
| 心率传感器 | android.hardware.sensor.heartrate | 是(BODY_SENSORS) |
| 指纹传感器 | android.hardware.fingerprint | 是(USE_FINGERPRINT) |
看到没?距离传感器属于「无脑用」的那一类。但别高兴太早,后面章节我会讲为什么它看似简单,实则坑很多。
3.4 本章知识体系
下面这张图帮你理清开发环境准备的核心逻辑:
3.5 验证环境是否就绪
配置完成后,我建议你做个小验证。在 MainActivity.java 里写几行代码,看看能不能获取到 SensorManager:
// 验证代码(Java)
SensorManager sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
Sensor proximitySensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
if (proximitySensor != null) {
Log.d("SensorTest", "距离传感器可用,最大范围:" + proximitySensor.getMaximumRange());
} else {
Log.w("SensorTest", "设备没有距离传感器");
}
如果 Logcat 里打印出了最大范围值(通常是 8.0 或 10.0 cm),说明环境配置成功。如果打印 null,嗯……要么是模拟器,要么是设备确实没有这个硬件。
好了,环境准备好了。下一章我们开始真正写代码,让距离传感器「动」起来。