核心概念:SDK 架构
大疆的 Mobile SDK 并不是一个简单的库,而是一个完整的、基于 DJISDKManager 的分层架构,理解这个架构是成功开发的第一步。

-
DJISDKManager (SDK 管理器)
- 核心作用:整个 SDK 的入口和生命周期管理中心。
- 主要任务:
- 注册 App:将你的 App 与大疆开发者账号关联,获取注册信息。
- 登录/注销:管理用户登录状态。
- 组件注册:注册你需要使用的功能组件(如飞行控制器、相机等)。
- SDK 状态监听:监听 SDK 的各种状态变化(如注册成功、登录成功、连接状态等)。
-
产品 Product (如 DJIAircraft)
- 代表你当前连接的无人机或手持云台,通过
DJISDKManager.getProduct()可以获取到当前连接的产品实例。
- 代表你当前连接的无人机或手持云台,通过
-
组件 Components (如 FlightController, Camera)
- 这是实现具体功能的模块,一个产品由多个组件组成。
- FlightController (飞行控制器):控制飞行(起飞、降落、摇杆控制、获取飞行器状态等)。
- Camera (相机):控制相机(拍照、录像、设置参数、获取预览流等)。
- BatteryState (电池状态):获取电池电量、电压、温度等信息。
- GPS (GPS 模块):获取经纬度、卫星数等信息。
- Gimbal (云台):控制云台转动。
-
数据流与监听
(图片来源网络,侵删)- 大疆 SDK 的核心数据交互方式是 监听模式。
- 你需要为每个组件的关键数据设置一个监听器(
DataListener或StateListener)。 - 当数据发生变化时(如电量从 80% 变为 79%),SDK 会自动回调你的监听器,并更新数据。
- 例如:要获取电池电量,你需要为
BatteryState组件设置一个监听器,然后在回调方法中获取最新的电量值。
开发环境搭建
在开始编码之前,请确保你的开发环境已经准备就绪。
-
硬件要求:
- 一台大疆无人机(如 Mavic, Air, Mini 系列)或手持云台(如 Osmo Mobile)。
- 一部运行 Android 系统的遥控器(如 Smart Controller)或安卓手机/平板。
- 确保遥控器和移动设备都已连接到无人机的 Wi-Fi 信号。
-
软件要求:
- Android Studio:最新稳定版。
- Java JDK:版本需与 Android Studio 兼容(通常为 JDK 8 或 11)。
- Android SDK:确保已安装所需的 SDK 版本。
- 大疆 DJI GO 4 App:用于对比和测试。
-
注册大疆开发者账号:
- 访问 大疆开发者官网。
- 注册一个账号,并创建一个新的 App。
- 在 App 创建页面,你需要填写 Bundle ID (对于 Android 是
applicationId),这个 ID 必须与你 Android 项目中的build.gradle文件中定义的applicationId完全一致。 - 创建成功后,你将获得一个 App Key,这是你的 App 与大疆服务器通信的唯一凭证。
-
配置 Android 项目:
-
Step 1: 添加 SDK 依赖 将大疆提供的 SDK AAR 文件或 Maven 仓库添加到你的
build.gradle(Module: app) 文件中。// build.gradle (Module: app) repositories { maven { url 'https://maven.dji.com/repository/releases' } } dependencies { implementation 'com.dji:dji-sdk:4.16' // 请使用最新版本 implementation 'com.dji:dji-uilibrary:4.16' // 可选,提供一些UI组件 } -
Step 2: 添加权限 在
AndroidManifest.xml中添加必要的权限。<!-- AndroidManifest.xml --> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <!-- Android 12 (API 31) 及以上需要 --> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
-
Step 3: 注册 App Key 在
AndroidManifest.xml的<application>标签内添加meta-data。<!-- AndroidManifest.xml --> <application ...> <meta-data android:name="com.dji.sdk.APP_KEY" android:value="你的App_Key" /> ... </application> -
Step 4: 配置 MultiDex (如果需要) 如果你的方法数超过 64K,需要在
build.gradle中启用 MultiDex。// build.gradle (Module: app) android { ... defaultConfig { ... multiDexEnabled true } } dependencies { implementation 'androidx.multidex:multidex:2.0.1' }
-
核心开发流程(代码示例)
下面是一个典型的 App 启动并连接无人机的流程。
初始化 SDK
在你的 Application 类或 MainActivity 的 onCreate() 方法中,初始化 SDK。
// MyApplication.java
import dji.common.product.Model;
import dji.sdk.base.DJIBaseProduct;
import dji.sdk.sdkmanager.DJISDKManager;
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// 初始化SDK
DJISDKManager.getInstance().registerApp(this, new DJISDKManager.SDKManagerCallback() {
@Override
public void onRegister(DJISDKManager.DJISDKError error) {
if (error == DJISDKManager.DJISDKError.REGISTRATION_SUCCESS) {
// 注册成功,开始连接产品
DJISDKManager.getInstance().startConnectionToProduct();
} else {
// 注册失败
Log.d("DJISDK", "注册失败: " + error.getDescription());
}
}
@Override
public void onProductConnected(DJIBaseProduct product) {
// 产品已连接
Log.d("DJISDK", "产品已连接: " + product.getModel());
// 在这里可以开始初始化各个组件
}
@Override
public void onProductDisconnected() {
// 产品已断开连接
Log.d("DJISDK", "产品已断开连接");
}
});
}
}
获取飞行器实例和飞行控制器
当 onProductConnected 回调被触发时,说明已经成功连接到无人机,此时可以获取到飞行器实例。
// 在你的 Activity 或 ViewModel 中
private FlightController flightController;
private void initFlightController() {
DJIBaseProduct product = DJISDKManager.getInstance().getProduct();
if (product != null && product instanceof Aircraft) {
flightController = ((Aircraft) product).getFlightController();
if (flightController != null) {
// 设置飞行控制器状态监听
flightController.setStateCallback(new FlightControllerState.Callback() {
@Override
public void onUpdate(FlightControllerState state) {
// 在这里获取飞行器状态
Log.d("FlightController", "飞行状态: " + state.getFlightMode());
Log.d("FlightController", "当前高度: " + state.getAircraftHeight() + " m");
Log.d("FlightController", "当前速度: " + state.getAircraftVelocity().getMagnitude() + " m/s");
}
});
}
}
}
执行基本飞行控制
假设你已经获取了 flightController 实例,可以通过它来发送飞行指令。
// 发送起飞指令
private void takeoff() {
if (flightController != null) {
flight 