睿诚科技协会

大疆无人机Android开发如何快速上手?

核心概念:SDK 架构

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

大疆无人机Android开发如何快速上手?-图1
(图片来源网络,侵删)
  1. DJISDKManager (SDK 管理器)

    • 核心作用:整个 SDK 的入口和生命周期管理中心。
    • 主要任务
      • 注册 App:将你的 App 与大疆开发者账号关联,获取注册信息。
      • 登录/注销:管理用户登录状态。
      • 组件注册:注册你需要使用的功能组件(如飞行控制器、相机等)。
      • SDK 状态监听:监听 SDK 的各种状态变化(如注册成功、登录成功、连接状态等)。
  2. 产品 Product (如 DJIAircraft)

    • 代表你当前连接的无人机或手持云台,通过 DJISDKManager.getProduct() 可以获取到当前连接的产品实例。
  3. 组件 Components (如 FlightController, Camera)

    • 这是实现具体功能的模块,一个产品由多个组件组成。
    • FlightController (飞行控制器):控制飞行(起飞、降落、摇杆控制、获取飞行器状态等)。
    • Camera (相机):控制相机(拍照、录像、设置参数、获取预览流等)。
    • BatteryState (电池状态):获取电池电量、电压、温度等信息。
    • GPS (GPS 模块):获取经纬度、卫星数等信息。
    • Gimbal (云台):控制云台转动。
  4. 数据流与监听

    大疆无人机Android开发如何快速上手?-图2
    (图片来源网络,侵删)
    • 大疆 SDK 的核心数据交互方式是 监听模式
    • 你需要为每个组件的关键数据设置一个监听器(DataListenerStateListener)。
    • 当数据发生变化时(如电量从 80% 变为 79%),SDK 会自动回调你的监听器,并更新数据。
    • 例如:要获取电池电量,你需要为 BatteryState 组件设置一个监听器,然后在回调方法中获取最新的电量值。

开发环境搭建

在开始编码之前,请确保你的开发环境已经准备就绪。

  1. 硬件要求

    • 一台大疆无人机(如 Mavic, Air, Mini 系列)或手持云台(如 Osmo Mobile)。
    • 一部运行 Android 系统的遥控器(如 Smart Controller)或安卓手机/平板。
    • 确保遥控器和移动设备都已连接到无人机的 Wi-Fi 信号。
  2. 软件要求

    • Android Studio:最新稳定版。
    • Java JDK:版本需与 Android Studio 兼容(通常为 JDK 8 或 11)。
    • Android SDK:确保已安装所需的 SDK 版本。
    • 大疆 DJI GO 4 App:用于对比和测试。
  3. 注册大疆开发者账号

    • 访问 大疆开发者官网
    • 注册一个账号,并创建一个新的 App。
    • 在 App 创建页面,你需要填写 Bundle ID (对于 Android 是 applicationId),这个 ID 必须与你 Android 项目中的 build.gradle 文件中定义的 applicationId 完全一致。
    • 创建成功后,你将获得一个 App Key,这是你的 App 与大疆服务器通信的唯一凭证。
  4. 配置 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 KeyAndroidManifest.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 类或 MainActivityonCreate() 方法中,初始化 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
分享:
扫描分享到社交APP
上一篇
下一篇