基于android studio 3.5

1、引入DJI mobile SDK 4.8和DJI UX SDK 4.8

部分build.gradle如下

apply plugin: 'com.android.application'android {compileSdkVersion 27buildToolsVersion "27.0.3"defaultConfig {multiDexEnabled truevectorDrawables.useSupportLibrary = truendk {abiFilters 'armeabi-v7a', 'x86', 'arm64-v8a'}}dexOptions {preDexLibraries = falsejavaMaxHeapSize "4g"}packagingOptions {doNotStrip "*/*/libdjivideo.so"doNotStrip "*/*/libSDKRelativeJNI.so"doNotStrip "*/*/libFlyForbid.so"doNotStrip "*/*/libduml_vision_bokeh.so"doNotStrip "*/*/libyuv2.so"doNotStrip "*/*/libGroudStation.so"doNotStrip "*/*/libFRCorkscrew.so"doNotStrip "*/*/libUpgradeVerify.so"doNotStrip "*/*/libFR.so"pickFirst 'lib/*/libstlport_shared.so'pickFirst 'lib/*/libRoadLineRebuildAPI.so'pickFirst 'lib/*/libGNaviUtils.so'pickFirst 'lib/*/libGNaviMapex.so'pickFirst 'lib/*/libGNaviData.so'pickFirst 'lib/*/libGNaviMap.so'pickFirst 'lib/*/libGNaviSearch.so'exclude 'META-INF/rxjava.properties'}
}
dependencies {//DJI UI库compile 'com.dji:dji-uxsdk:4.8'//DJI SDKprovided 'com.dji:dji-sdk-provided:4.8'
}

2、AndroidManifest配置

 <!-- DJI SDK need permission --><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.WAKE_LOCK" /><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.MOUNT_UNMOUNT_FILESYSTEMS" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /><uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-feature android:name="android.hardware.camera" /><uses-feature android:name="android.hardware.camera.autofocus" /><uses-featureandroid:name="android.hardware.usb.host"android:required="false" /><uses-featureandroid:name="android.hardware.usb.accessory"android:required="true" /><!-- SDK requirement permission end -->
 <applicationandroid:name=".YourApplication"android:allowBackup="true"android:icon="@mipmap/applogo"android:label="@string/app_name"android:supportsRtl="true"android:theme="@style/AppTheme"tools:replace="android:icon,android:theme"><!-- DJI SDK --><uses-library android:name="com.android.future.usb.accessory" /><meta-dataandroid:name="com.dji.sdk.API_KEY"android:value="Your Key" /> <!-- KEY去大疆开发者网页去申请android mobile SDK --><!-- DJI SDK --><activityandroid:name=".UI.StartActivity"android:configChanges="orientation|keyboardHidden|screenSize"android:label="@string/app_name"android:launchMode="standard"android:theme="@style/WelcomeTheme"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter><intent-filter><action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" /></intent-filter><meta-dataandroid:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"android:resource="@xml/accessory_filter" /></activity>  </application>

3、注册帮助类,从4.4之后

在Applicatiom中加入如下代码:

 @Overrideprotected void attachBaseContext(Context base) {super.attachBaseContext(base);MultiDex.install(this);Helper.install(YourApplication.this);//引入大疆帮助类}

4、MainActivity连接飞机

FlightController mFlightController = null;
FlightController.OnboardSDKDeviceDataCallback receiveCallback;private AtomicBoolean isRegistrationInProgress = new AtomicBoolean(false);private DJISDKManager.SDKManagerCallback registrationCallback = new DJISDKManager.SDKManagerCallback() {@Overridepublic void onRegister(DJIError error) {isRegistrationInProgress.set(false);if (error == DJISDKError.REGISTRATION_SUCCESS) {DJISDKManager.getInstance().setCallbackRunInUIThread(true);DJISDKManager.getInstance().startConnectionToProduct();//Toast.makeText(getApplicationContext(), "SDK registration succeeded!", Toast.LENGTH_LONG).show();myHandler.sendEmptyMessage(3);//检查登陆} else {Toast.makeText(getApplicationContext(),//"SDK registration failed, check network and retry!","DJI SDK 注册失败, 请检查网络后重试!",Toast.LENGTH_LONG).show();}}@Overridepublic void onProductChange(BaseProduct baseProduct, BaseProduct baseProduct1) {Log.v(TAG, String.format("onProductChanged oldProduct:%s, newProduct:%s", baseProduct, baseProduct1));mProduct = baseProduct1;if (mProduct != null) {mProduct.setBaseProductListener(mDJIBaseProductListener);}notifyStatusChange();}private BaseProduct.BaseProductListener mDJIBaseProductListener = new BaseProduct.BaseProductListener() {@Overridepublic void onComponentChange(BaseProduct.ComponentKey key, BaseComponent oldComponent, BaseComponent newComponent) {if (newComponent != null) {newComponent.setComponentListener(mDJIComponentListener);}Log.v(TAG, String.format("onComponentChange key:%s, oldComponent:%s, newComponent:%s", key, oldComponent, newComponent));notifyStatusChange();}@Overridepublic void onConnectivityChange(boolean b) {Log.v(TAG, "onProductConnectivityChanged: " + b);notifyStatusChange();}};private BaseComponent.ComponentListener mDJIComponentListener = new BaseComponent.ComponentListener() {@Overridepublic void onConnectivityChange(boolean b) {notifyStatusChange();}};private void notifyStatusChange() {myHandler.sendEmptyMessage(2);}};private static final String[] REQUIRED_PERMISSION_LIST = new String[]{Manifest.permission.VIBRATE,Manifest.permission.INTERNET,Manifest.permission.ACCESS_WIFI_STATE,Manifest.permission.WAKE_LOCK,Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_NETWORK_STATE,Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.CHANGE_WIFI_STATE,Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.BLUETOOTH,Manifest.permission.BLUETOOTH_ADMIN,Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.READ_PHONE_STATE,};private static final int REQUEST_PERMISSION_CODE = 12345;private List<String> missingPermission = new ArrayList<>();/*** 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);}}/*** Result of runtime permission request*/@Overridepublic 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();}}private void startSDKRegistration() {if (isRegistrationInProgress.compareAndSet(false, true)) {AsyncTask.execute(new Runnable() {@Overridepublic void run() {DJISDKManager.getInstance().registerApp(MainActivity.this, registrationCallback);}});}}@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);checkAndRequestPermissions();
}  private void refreshSDKRelativeUI() {//此方法sendEmptyMessege 2的调用mProduct = SearchApplication.getProductInstance();if (null != mProduct && mProduct.isConnected()) {        if (mFlightController == null) {Aircraft mAircraft1 = (Aircraft) DJISDKManager.getInstance().getProduct();if (mAircraft1 != null)mFlightController = mAircraft1.getFlightController();//获取飞控类}if (mFlightController != null) {if (mFlightController.isOnboardSDKDeviceAvailable() && bFirst && actimer == null)//检查板载SDK}imgproduct.setImageResource(R.mipmap.v2_m600_pro_connect_icon);String str = mProduct instanceof Aircraft ? "DJIAircraft" : "DJIHandHeld";mTextConnectionStatus.setText("状态: " + str + " 连接成功");if (null != mProduct.getModel()) {mTextProduct.setText("" + mProduct.getModel().getDisplayName());} else {mTextProduct.setText(R.string.product_information);}if (receiveCallback == null) {receiveCallback = new FlightController.OnboardSDKDeviceDataCallback() {//板载SDK回复的数据,如果要用到的话@Overridepublic void onReceive(byte[] bytes) {}};mFlightController.setOnboardSDKDeviceDataCallback(receiveCallback);}}
}

5、高版本SDK必须要登录帐号,如果版本过低或者未登录帐号,飞机则会限高限远,下面是检查登录和登录操作

private void loginAccount() {//检查登录UserAccountState userAccountState = UserAccountManager.getInstance().getUserAccountState();//如果用户 NOT_LOGGED_IN TOKEN_OUT_OF_DATE INVALID_TOKEN UNKNOWN 则弹出对话框重新登陆if (userAccountState == UserAccountState.NOT_LOGGED_IN ||userAccountState == UserAccountState.TOKEN_OUT_OF_DATE ||userAccountState == UserAccountState.INVALID_TOKEN ||userAccountState == UserAccountState.UNKNOWN) {login();} else {//否则显示用户名UserAccountManager.getInstance().getLoggedInDJIUserAccountName(new CommonCallbacks.CompletionCallbackWith<String>() {@Overridepublic void onSuccess(String s) {csUser = s;myHandler.sendEmptyMessage(0);}@Overridepublic void onFailure(DJIError djiError) {login();}});}}private void login() {if (UserAccountManager.getInstance() == null)return;UserAccountManager.getInstance().logIntoDJIUserAccount(MainActivity.this,new CommonCallbacks.CompletionCallbackWith<UserAccountState>() {@Overridepublic void onSuccess(final UserAccountState userAccountState) {if (userAccountState == UserAccountState.NOT_AUTHORIZED ||userAccountState == UserAccountState.AUTHORIZED) {Toast.makeText(MainActivity.this, "登陆成功", Toast.LENGTH_LONG).show();UserAccountManager.getInstance().getLoggedInDJIUserAccountName(new CommonCallbacks.CompletionCallbackWith<String>() {@Overridepublic void onSuccess(String s) {csUser = s;myHandler.sendEmptyMessage(0);}@Overridepublic void onFailure(DJIError djiError) {}});}}@Overridepublic void onFailure(DJIError error) {Toast.makeText(MainActivity.this, "登陆错误:" + error.getDescription(), Toast.LENGTH_LONG).show();}});}

6、可以FlightController 获取飞控信息,或者直接用UI库里面的控件会自动刷新飞行器信息

大疆无人机二次开发简介-引入DJI mobile SDK 4.8相关推荐

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

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

  2. 大疆无人机支持移动开发二次开发的设备支持

    Mobile SDK:旨在让开发者能够访问DJI无人机和手持相机产品的丰富功能.该SDK通过兼顾更底层的功能,诸如飞行稳定,电池管理,信号传输和通信等,简化了应用程序开发的过程.连接框图及设备支持如下 ...

  3. 大疆无人机-guidance妙算模块简介

    这里主要讲解一下大疆的妙算模块如何与飞控进行连接和通信: 首先了解官方的相关介绍https://www.dji.com/cn/guidance/info#video 观看视频并且下载用户手册 在用户手 ...

  4. E:大疆M300二次开发PSDKV2.1.0。无法识别无人机型号。一直出现 aircraft type 0

    连接好设备后(M300无人机,开发套件2.0,选用树莓派4B),可以运行示例程序,但是一直打印 [35.664][module_core]-[Info]-[PsdkCore_Init:134]PSDK ...

  5. 基于大疆无人机SDK二次开发

    基于大疆无人机SDK二次开发 近期公司项目需求,需要基于大疆无人机SDK开发一款手机 APP,用于配合后台实现对无人机的管理.当然大疆本身也给我们提供了管理平台-----大疆司空.通过大疆的官方 AP ...

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

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

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

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

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

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

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

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

最新文章

  1. leetcode 216. Combination Sum III | 216. 组合总和 III(Java)
  2. Qt学习之路(28): 坐标变换
  3. java 着色问题 回溯算法,C语言使用回溯法解旅行售货员问题与图的m着色问题
  4. HDOJ 1233 (克鲁斯卡尔+并查集)
  5. iOS工程中创建pch文件
  6. python存文件代码_Python文件读写保存操作的示例代码
  7. 室内定位技术(一) TOA TDOA RSS AOA
  8. 百度地图--南京行政区域划分
  9. 【MAVEN】maven仓库搜索功能
  10. Python代码cProfile耗时分析及可视化
  11. 怎样做网络推广浅析网站标题如何写更利于SEO?
  12. 欧盟 GDPR 通用数据保护条例正式生效后,各行业影响分析
  13. TTL,CMOS,LVTTL,LVCMOS电平标准
  14. 如何发表一篇核心期刊论文
  15. 腾讯云赶超阿里云有无机会?
  16. 你为何没有年薪百万?大部分故事是有隐藏的成功背景
  17. 15.2 矩阵链乘法
  18. svg android动画制作,SVG动画案例的学习_SVG, SVG Animation, Animation, Web动画 教程_W3cplus...
  19. IOS AppStore提交流程
  20. 联联周边游系统开发源码及搭建

热门文章

  1. PLSQL Developer安装、OCI库、tnsnames.ora配置
  2. 中国地址英文书写格式(转载)
  3. 美国各个州的科技宅们都在Google些啥?
  4. ACM省赛海岛争霸(Dijkstra和DFS两种方法)
  5. 【总结】1181- 从 0 到 1 上手 Web Components 业务组件库开发
  6. mac安装redis管理工具rmd
  7. Fragment 跳转到指定的Fragment 与 Activity跳转到指定的Fragment 的方法
  8. 使用WM_COPYDATA消息在不同进程间或窗口间通信传递数据
  9. 一张图看懂OSI 7层模型
  10. 脸谱世界 php,【文博纵览】一张脸谱 一个精神世界