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 就有了,但新设备上有些行为变了,我后面会讲。
  • 模拟器:如果你没有真机,可以创建带传感器的模拟器。但说实话,模拟器的距离传感器数据是假的,我建议你搞一台真机。
我的小技巧:安装路径不要有中文和空格。我之前有个项目,同事路径里有「传感器」三个中文字,结果 NDK 编译死活过不去。折腾了两小时才发现是路径问题。

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.SensorSensorManager 就在 SDK 里,直接就能用。

不过,如果你要做更高级的传感器融合(比如距离+光线传感器联合判断),可以考虑用 Google 的 androidx.car.sensor 库。但咱们入门阶段,完全不需要。

3.3 在 AndroidManifest.xml 中声明传感器权限

好,重点来了。距离传感器需要什么权限?

答案是:普通传感器不需要运行时权限。

你可能会问:「那为什么还要声明?」

其实,大多数传感器(距离、加速度、陀螺仪等)在 Android 中属于 普通权限,系统会自动授予。但有些传感器(比如心率、指纹)需要运行时权限。距离传感器属于前者。

不过,我建议你还是显式声明一下,原因有二:

  1. 代码可读性:别人看你的 Manifest,一眼就知道你用了哪些传感器。
  2. 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 本章知识体系

下面这张图帮你理清开发环境准备的核心逻辑:

开发环境准备核心流程 Android Studio 安装与配置 • 下载最新稳定版 • 配置 JDK 11+ • 安装 SDK Platforms • 安装 SDK Tools • 可选:NDK 安装 (用于底层驱动开发) 创建传感器项目 DistanceSensorDemo • 选择 Empty Activity • 包名:com.example.sensor • 语言:Java / Kotlin • 无需额外依赖库 • 框架自带 Sensor API (android.hardware 包) Manifest 声明 传感器权限 • uses-feature 声明 • proximity 传感器 • required=true/false • 普通权限无需运行时 • 提高代码可读性 (避免审核问题) 核心原则:工具顺手 → 项目规范 → 声明清晰 → 避免踩坑

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,嗯……要么是模拟器,要么是设备确实没有这个硬件。

记住:开发环境准备这一步,看似简单,但很多人后面出问题都是因为这里没弄干净。我见过最离谱的是有人用 Android Studio 4.0 编译 API 33 的项目,Gradle 版本不兼容,折腾了一整天。所以,版本匹配 是重中之重。

好了,环境准备好了。下一章我们开始真正写代码,让距离传感器「动」起来。


公众号:蓝海资料掘金营,微信deep3321