目录:

大疆无人机DJI Mobile SDK(Android)入门(一)

大道无疆,创新无限!

将您的想法变为现实!

未来,无所不能!

小Z码农有幸能接触到这么高逼格的玩具。就将这段爱恨往事作为笔记记录下来......哈哈哈哈!下面开始开车了。。请系好安全带!

准备工作:

1、支持Mobile SDK 的DJI 无人机产品一架(满满的土豪感);

2、DJI Assistant 2 测试PC端模拟器下载安装;

3、android5.0手机一个(Mobile SDK 只支持5.0以上,测试手机型号HUAWEI M5 (版本android 9)和Honor 10 (版本android 10));

可根据DJI网站查看对应SDK 支持产品型号:https://developer.dji.com/products/#!/mobile

DJI Assistant 2下载地址:https://www.dji.com/cn/downloads?site=brandsite&from=footer

DJI Mobile SDK 文档查看地址:https://developer.dji.com/mobile-sdk/

和其它第三方SDK库一样,

1、注册DJI账号

2、创建Mobile SDK 应用

3、AndroidManifest.xml 填写DJI的应用App key

4、app的build.gradle 中依赖DJI库

创建DJI应用得到App key

依赖库如下(最新relase):

implementation('com.dji:dji-sdk:4.11.1', {exclude module: 'library-anti-distortion'exclude module: 'fly-safe-database'
})
compileOnly 'com.dji:dji-sdk-provided:4.11.1

一、注册SDK使用

1)registerApp必须先成功使用SDK注册,然后才能将DJI产品与SDK一起使用。

文档中registerApp属于DJISDKManager下的功能,所以调用如下注册方法

2)权限申请:

<!-- SDK permission requirement -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-featureandroid:name="android.hardware.usb.host"android:required="false"/>
<uses-featureandroid:name="android.hardware.usb.accessory"android:required="true"/>

DJISampleApplication

public class DJISampleApplication extends Application {public static final String TAG = DJISampleApplication.class.getName();private static BaseProduct product;private static BluetoothProductConnector bluetoothConnector = null;private static Bus bus = new Bus(ThreadEnforcer.ANY);private static Application app = null;/*** Gets instance of the specific product connected after the* API KEY is successfully validated. Please make sure the* API_KEY has been added in the Manifest*/public static synchronized BaseProduct getProductInstance() {product = DJISDKManager.getInstance().getProduct();return product;}public static synchronized BluetoothProductConnector getBluetoothProductConnector() {bluetoothConnector = DJISDKManager.getInstance().getBluetoothProductConnector();return bluetoothConnector;}public static boolean isAircraftConnected() {return getProductInstance() != null && getProductInstance() instanceof Aircraft;}public static boolean isHandHeldConnected() {return getProductInstance() != null && getProductInstance() instanceof HandHeld;}public static synchronized Aircraft getAircraftInstance() {if (!isAircraftConnected()) {return null;}return (Aircraft) getProductInstance();}public static synchronized HandHeld getHandHeldInstance() {if (!isHandHeldConnected()) {return null;}return (HandHeld) getProductInstance();}public static Application getInstance() {return DJISampleApplication.app;}public static Bus getEventBus() {return bus;}@Overrideprotected void attachBaseContext(Context paramContext) {super.attachBaseContext(paramContext);MultiDex.install(this);com.secneo.sdk.Helper.install(this);app = this;}
}

MainActivity

private static final String[] REQUIRED_PERMISSION_LIST = new String[] {Manifest.permission.VIBRATE, // Gimbal rotationManifest.permission.INTERNET, // API requestsManifest.permission.ACCESS_WIFI_STATE, // WIFI connected productsManifest.permission.ACCESS_COARSE_LOCATION, // MapsManifest.permission.ACCESS_NETWORK_STATE, // WIFI connected productsManifest.permission.ACCESS_FINE_LOCATION, // MapsManifest.permission.CHANGE_WIFI_STATE, // Changing between WIFI and USB connectionManifest.permission.WRITE_EXTERNAL_STORAGE, // Log filesManifest.permission.BLUETOOTH, // Bluetooth connected productsManifest.permission.BLUETOOTH_ADMIN, // Bluetooth connected productsManifest.permission.READ_EXTERNAL_STORAGE, // Log filesManifest.permission.READ_PHONE_STATE, // Device UUID accessed upon registrationManifest.permission.RECORD_AUDIO // Speaker accessory
};
private static final int REQUEST_PERMISSION_CODE = 12345;//region Life-cycle
@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);checkAndRequestPermissions();DJISampleApplication.getEventBus().register(this);setContentView(R.layout.activity_main);
}
/*** Result of runtime permission request*/
@Override
public void onRequestPermissionsResult(int requestCode,@NonNull String[] permissions,@NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);// Check for granted permission and remove from missing listif (requestCode == REQUEST_PERMISSION_CODE) {for (int i = grantResults.length - 1; i >= 0; i--) {if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {missingPermission.remove(permissions[i]);}}}// If there is enough permission, we will start the registrationif (missingPermission.isEmpty()) {startSDKRegistration();} else {Toast.makeText(getApplicationContext(), "Missing permissions!!!", Toast.LENGTH_LONG).show();}
}/*** Checks if there is any missing permissions, and* requests runtime permission if needed.*/
private void checkAndRequestPermissions() {// Check for permissionsfor (String eachPermission : REQUIRED_PERMISSION_LIST) {if (ContextCompat.checkSelfPermission(this, eachPermission) != PackageManager.PERMISSION_GRANTED) {missingPermission.add(eachPermission);}}// Request for missing permissionsif (missingPermission.isEmpty()) {startSDKRegistration();} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {ActivityCompat.requestPermissions(this,missingPermission.toArray(new String[missingPermission.size()]),REQUEST_PERMISSION_CODE);}
}private void startSDKRegistration() {if (isRegistrationInProgress.compareAndSet(false, true)) {AsyncTask.execute(new Runnable() {@Overridepublic void run() {ToastUtils.setResultToToast(MainActivity.this.getString(R.string.sdk_registration_doing_message));DJISDKManager.getInstance().registerApp(MainActivity.this.getApplicationContext(), new DJISDKManager.SDKManagerCallback() {@Overridepublic void onRegister(DJIError djiError) {if (djiError == DJISDKError.REGISTRATION_SUCCESS) {DJILog.e("App registration", DJISDKError.REGISTRATION_SUCCESS.getDescription());DJISDKManager.getInstance().startConnectionToProduct();ToastUtils.setResultToToast(MainActivity.this.getString(R.string.sdk_registration_success_message));showDBVersion();} else {ToastUtils.setResultToToast(MainActivity.this.getString(R.string.sdk_registration_message) + djiError.getDescription());}Log.v(TAG, djiError.getDescription());}@Overridepublic void onProductDisconnect() {Log.d(TAG, "onProductDisconnect");//断开}@Overridepublic void onProductConnect(BaseProduct baseProduct) {Log.d(TAG, String.format("onProductConnect newProduct:%s", baseProduct));//连上}@Overridepublic void onComponentChange(BaseProduct.ComponentKey componentKey,BaseComponent oldComponent,BaseComponent newComponent) {if (newComponent != null) {newComponent.setComponentListener(mDJIComponentListener);}Log.d(TAG,String.format("onComponentChange key:%s, oldComponent:%s, newComponent:%s",componentKey,oldComponent,newComponent));notifyStatusChange();}@Overridepublic void onInitProcess(DJISDKInitEvent djisdkInitEvent, int i) {}@Overridepublic void onDatabaseDownloadProgress(long current, long total) {//首次注册使用联网下载基础数据}});}});}
}@Override
protected void onDestroy() {DJISampleApplication.getEventBus().unregister(this);super.onDestroy();
}

由于涉及某些制度隐私问题,所以就只晒下应用的一些截图结果,欢迎各位留言交流学习!!

大疆无人机DJI Mobile SDK入门(一)相关推荐

  1. 大疆无人机安卓Mobile Sdk开发(三)制定航点任务WaypointMission

    大疆无人机安卓Mobile Sdk开发(一)简单介绍 大疆无人机安卓Mobile Sdk开发(二)连接无人机,获取无人机信息 大疆无人机安卓Mobile Sdk开发(三)制定航点任务WaypointM ...

  2. 大疆无人机安卓Mobile Sdk开发(一)简单介绍

    大疆无人机安卓Mobile Sdk开发(一)简单介绍 大疆无人机安卓Mobile Sdk开发(二)连接无人机,获取无人机信息 大疆无人机安卓Mobile Sdk开发(三)制定航点任务WaypointM ...

  3. 大疆无人机安卓Mobile Sdk开发(二)连接无人机,获取无人机信息

    大疆无人机安卓Mobile Sdk开发(一)简单介绍 大疆无人机安卓Mobile Sdk开发(二)连接无人机,获取无人机信息 大疆无人机安卓Mobile Sdk开发(三)制定航点任务WaypointM ...

  4. 大疆无人机安卓Mobile Sdk开发(四)读取飞机的图片和视频并下载

    大疆无人机安卓Mobile Sdk开发(一)简单介绍 大疆无人机安卓Mobile Sdk开发(二)连接无人机,获取无人机信息 大疆无人机安卓Mobile Sdk开发(三)制定航点任务WaypointM ...

  5. 大疆无人机安卓Mobile Sdk开发(五)解决M300Rtk H20相机无法获取图片视频的问题

    大疆无人机安卓Mobile Sdk开发(一)简单介绍 大疆无人机安卓Mobile Sdk开发(二)连接无人机,获取无人机信息 大疆无人机安卓Mobile Sdk开发(三)制定航点任务WaypointM ...

  6. 大疆无人机安卓Mobile Sdk开发

    大疆无人机安卓Mobile Sdk开发 地址 开发步骤 使用接口 地址 大疆sdk文档地址 大疆sdk github 开发步骤 步骤: 进行开发前首先需要注册大疆开发者账号,然后注册一个基于mobil ...

  7. 大疆 DJI mobile SDK系列详细教程——运行实例代码(跑通大疆官方提供Mobile SDK里的sample code)

    大疆 DJI mobile SDK系列详细教程--运行实例代码(跑通大疆官方提供Mobile SDK里的sample code) 文章目录 一.官方文献与资源地址 二.操作步骤 提示:昨天在尝试跑通大 ...

  8. 大疆无人机参数解释YAW/Roll/Pitch

    大疆无人机安卓Mobile Sdk开发(一)简单介绍 很多人对yaw,roll,和picth的含义不是很懂,下面用大疆官方的一张图给大家解释一下,一目了然 pitch是俯仰,roll是横滚,yaw是航 ...

  9. 大疆无人机二次开发进阶-DJI mobile SDK和DJI onboard SDK联合开发行业应用项目

    PS:最近又涉及该项目,增加部分没写内容,记录下详细步骤. 上一篇文章讲到了怎么使用DJI mobile SDK,这次主要讲解DJI mobile SDK和DJI onboard SDK联合开发. a ...

最新文章

  1. Linux异步之信号(signal)机制分析
  2. awk 里面添加单引号
  3. SQL 查找重复记录
  4. MRC522(2):超简易门禁
  5. ElementUI 按需引入坑爹的点记录
  6. 个人作业六:单元测试
  7. 2.开发Mip组件的第一个demo(点击关闭按钮,关闭外层dom)
  8. WinFrom 中 label背景透明
  9. MATLAB机械动力分析,基于MATLAB的柔性机械臂动力学分析
  10. PEPS 无钥匙进入系统低频芯片 PCF7991 介绍
  11. Variable @link-color is undefined
  12. 专访京东科技张亮:本土开源需形成吸纳开发者的靶心
  13. 关于nginx报499的问题排查分析
  14. 记录Java Web The server encountered an internal error that prevented it from fulfilling报错及解决
  15. 瘸子偷了乞丐的包,瞎子看见了,哑巴大声叫,罗锅挺身去追,疯子说我们要冷静,弓虽强怎奈石更硬。
  16. 信贷风控评分卡模型(上)_Give Me Some Credit(技术实现过程)
  17. AOP术语、SpringAOP
  18. 添加多浏览器支持是什么意思_低gi什么意思,减肥期间一定要多吃低gi的食物吗?- 理财技巧...
  19. android绘画板界面,手机绘画板(MediBang Paint Tablet)
  20. 一文让你知道测试职业到底有哪些发展方向

热门文章

  1. 美国计算机博士资格考试难吗,美国计算机博士院校申请的难度在哪里
  2. C++ 集合set 详解
  3. axure内联框架和动态面板_Axure -- 动态面板入门解析
  4. CFA问题大总结,看了这篇文章,你的问题全解决
  5. psql: error: connection to server on socket “/tmp/.s.PGSQL.5432“ failed: No such file or directory
  6. matlab对信号包络的两种画法
  7. 表情可字怎么打_微信新表情怎么打?看完这篇就知道了
  8. 深入浅出 SSL/CA 证书及其相关证书文件(pem、crt、cer、key、csr)
  9. B站网页黑白色转彩色(油猴)
  10. 私人云储存解决方案——可道云kodexplorer【零成本】