大疆无人机二次开发简介-引入DJI mobile SDK 4.8
基于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相关推荐
- 大疆无人机二次开发进阶-DJI mobile SDK和DJI onboard SDK联合开发行业应用项目
PS:最近又涉及该项目,增加部分没写内容,记录下详细步骤. 上一篇文章讲到了怎么使用DJI mobile SDK,这次主要讲解DJI mobile SDK和DJI onboard SDK联合开发. a ...
- 大疆无人机支持移动开发二次开发的设备支持
Mobile SDK:旨在让开发者能够访问DJI无人机和手持相机产品的丰富功能.该SDK通过兼顾更底层的功能,诸如飞行稳定,电池管理,信号传输和通信等,简化了应用程序开发的过程.连接框图及设备支持如下 ...
- 大疆无人机-guidance妙算模块简介
这里主要讲解一下大疆的妙算模块如何与飞控进行连接和通信: 首先了解官方的相关介绍https://www.dji.com/cn/guidance/info#video 观看视频并且下载用户手册 在用户手 ...
- E:大疆M300二次开发PSDKV2.1.0。无法识别无人机型号。一直出现 aircraft type 0
连接好设备后(M300无人机,开发套件2.0,选用树莓派4B),可以运行示例程序,但是一直打印 [35.664][module_core]-[Info]-[PsdkCore_Init:134]PSDK ...
- 基于大疆无人机SDK二次开发
基于大疆无人机SDK二次开发 近期公司项目需求,需要基于大疆无人机SDK开发一款手机 APP,用于配合后台实现对无人机的管理.当然大疆本身也给我们提供了管理平台-----大疆司空.通过大疆的官方 AP ...
- 大疆无人机安卓Mobile Sdk开发(二)连接无人机,获取无人机信息
大疆无人机安卓Mobile Sdk开发(一)简单介绍 大疆无人机安卓Mobile Sdk开发(二)连接无人机,获取无人机信息 大疆无人机安卓Mobile Sdk开发(三)制定航点任务WaypointM ...
- 大疆无人机安卓Mobile Sdk开发(四)读取飞机的图片和视频并下载
大疆无人机安卓Mobile Sdk开发(一)简单介绍 大疆无人机安卓Mobile Sdk开发(二)连接无人机,获取无人机信息 大疆无人机安卓Mobile Sdk开发(三)制定航点任务WaypointM ...
- 大疆无人机安卓Mobile Sdk开发(五)解决M300Rtk H20相机无法获取图片视频的问题
大疆无人机安卓Mobile Sdk开发(一)简单介绍 大疆无人机安卓Mobile Sdk开发(二)连接无人机,获取无人机信息 大疆无人机安卓Mobile Sdk开发(三)制定航点任务WaypointM ...
- 大疆无人机安卓Mobile Sdk开发(三)制定航点任务WaypointMission
大疆无人机安卓Mobile Sdk开发(一)简单介绍 大疆无人机安卓Mobile Sdk开发(二)连接无人机,获取无人机信息 大疆无人机安卓Mobile Sdk开发(三)制定航点任务WaypointM ...
最新文章
- leetcode 216. Combination Sum III | 216. 组合总和 III(Java)
- Qt学习之路(28): 坐标变换
- java 着色问题 回溯算法,C语言使用回溯法解旅行售货员问题与图的m着色问题
- HDOJ 1233 (克鲁斯卡尔+并查集)
- iOS工程中创建pch文件
- python存文件代码_Python文件读写保存操作的示例代码
- 室内定位技术(一) TOA TDOA RSS AOA
- 百度地图--南京行政区域划分
- 【MAVEN】maven仓库搜索功能
- Python代码cProfile耗时分析及可视化
- 怎样做网络推广浅析网站标题如何写更利于SEO?
- 欧盟 GDPR 通用数据保护条例正式生效后,各行业影响分析
- TTL,CMOS,LVTTL,LVCMOS电平标准
- 如何发表一篇核心期刊论文
- 腾讯云赶超阿里云有无机会?
- 你为何没有年薪百万?大部分故事是有隐藏的成功背景
- 15.2 矩阵链乘法
- svg android动画制作,SVG动画案例的学习_SVG, SVG Animation, Animation, Web动画 教程_W3cplus...
- IOS AppStore提交流程
- 联联周边游系统开发源码及搭建
热门文章
- PLSQL Developer安装、OCI库、tnsnames.ora配置
- 中国地址英文书写格式(转载)
- 美国各个州的科技宅们都在Google些啥?
- ACM省赛海岛争霸(Dijkstra和DFS两种方法)
- 【总结】1181- 从 0 到 1 上手 Web Components 业务组件库开发
- mac安装redis管理工具rmd
- Fragment 跳转到指定的Fragment 与 Activity跳转到指定的Fragment 的方法
- 使用WM_COPYDATA消息在不同进程间或窗口间通信传递数据
- 一张图看懂OSI 7层模型
- 脸谱世界 php,【文博纵览】一张脸谱 一个精神世界