android大疆飞控界面,DJI Android SDK 开发笔记(入门篇)
##大疆SDK開發筆記##
#1.文檔相關
2.Android SDK文檔
接入Android的SDK都在這部分,飛控相關的接口。
3.Android UX SDK文檔
大疆自定義的組件,已經跟飛機關聯,直接用即可。
4.官方Git庫
相關Demo都在里面
5.注冊成為開發者
[開發者注冊](https://account.dji.com/register?appId=dji_sdk&backUrl=https%3A%2F%2Fdeveloper.dji.com%2Fuser&locale=en_US)
注:每一個Android應用都要注冊APPkey,否則調用不了SDK。
6.Mobile-UXSDK-Android 結合的Demo(飛控界面)
地址下載
#2.飛行模擬器下載地址
#3.Android SDK
預覽大圖 #4.Android UX SDK
#5.Android Studio接入DIJ SDK步驟
5.1.app的build.gradle添加
implementation 'com.dji:dji-sdk:4.10'
implementation 'com.dji:dji-uxsdk:4.10'
compileOnly 'com.dji:dji-sdk-provided:4.10'
5.2.app的build.gradle的android中
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"
doNotStrip "*/*/libDJIFlySafeCore.so"
doNotStrip "*/*/libdjifs_jni.so"
doNotStrip "*/*/libsfjni.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'
pickFirst 'lib/*/libDJIFlySafeCore.so'
pickFirst 'lib/*/libdjifs_jni.so'
pickFirst 'lib/*/libsfjni.so'
exclude 'META-INF/rxjava.properties'
}
5.3 AndroidManifest.xml添加權限
android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
tools:ignore="ProtectedPermissions" />
android:name="android.hardware.usb.host"
android:required="false" />
android:name="android.hardware.usb.accessory"
android:required="true" />
application里面
android:name="com.dji.sdk.API_KEY"
android:value="9a13028ed03500ad035980f9" />
android:name="dji.sdk.sdkmanager.DJIAoaControllerActivity"
android:theme="@android:style/Theme.Translucent">
android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"
android:resource="@xml/accessory_filter" />
#6.SDK初始化以及接口相關 *注:DJI的相關回調都在子線程里面!請勿在操作UI。
###6.1初始化SDK DJISDKManager.getInstance().registerApp(MainActivity.this.getApplicationContext(), new DJISDKManager.SDKManagerCallback() { @Override public void onRegister(DJIError djiError) { //子線程的回調 if (djiError == DJISDKError.REGISTRATION_SUCCESS) { //SDK 注冊成功 啟動連接到飛機 DJISDKManager.getInstance().startConnectionToProduct(); } else { //SDK 注冊失敗 需要在子線程操作UI } Log.v(TAG, djiError.getDescription()); }
@Override
public void onProductDisconnect() {
Log.d(TAG, "onProductDisconnect");
notifyStatusChange();
}
@Override
public void onProductConnect(BaseProduct baseProduct) {
Log.d(TAG, String.format("onProductConnect newProduct:%s", baseProduct));
notifyStatusChange();
}
@Override
public void onComponentChange(BaseProduct.ComponentKey componentKey, BaseComponent oldComponent,
BaseComponent newComponent) {
//DJI SDK 連接發生改變
if (newComponent != null) {
newComponent.setComponentListener(new BaseComponent.ComponentListener() {
@Override
public void onConnectivityChange(boolean isConnected) {
Log.d(TAG, "onComponentConnectivityChanged: " + isConnected);
//DJI SDK 連接發生改變
notifyStatusChange();
}
});
}
Log.d(TAG, String.format("onComponentChange key:%s, oldComponent:%s, newComponent:%s",
componentKey,
oldComponent,
newComponent));
}
@Override
public void onInitProcess(DJISDKInitEvent djisdkInitEvent, int i) {
}
});
private void notifyStatusChange() {
if (mHandler == null) {
mHandler = new Handler(getMainLooper());
}
mHandler.removeCallbacks(updateRunnable);
mHandler.postDelayed(updateRunnable, 500);
}
###6.2登錄DJI賬號 private void DJIUserLogin() { UserAccountManager.getInstance().logIntoDJIUserAccount(MainActivity.this, new CommonCallbacks.CompletionCallbackWith() { @Override public void onSuccess(final UserAccountState userAccountState) { //登錄成功的回調 子線程回調 } @Override public void onFailure(final DJIError djiError) { //登錄失敗的錯誤回調 } }); }
###6.3獲取登錄DJI賬號相關的信息 private void getDjiLoginUserName() { UserAccountManager.getInstance().getLoggedInDJIUserAccountName(new CommonCallbacks.CompletionCallbackWith() { @Override public void onSuccess(final String s) { //s為登錄的用戶名 }
@Override
public void onFailure(final DJIError djiError) {
//獲取失敗 錯誤詳情請查看djierror類
}
});
}
*注:完成以上的注冊SDK、和登錄用戶名后,就能進入到正式DJI SDK開發了。
6.4 XML布局文件
android:id="@+id/fpvwidget"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
custom:sourceCameraNameVisibility="false" />
android:id="@+id/fPVOverlayWidget"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center" />
dji.ux.widget.FPVWidget
這個控件用戶顯示飛控的相機的畫面,DJI已經綁定,直接用即可。
custom:sourceCameraNameVisibility="false"
此屬性用設置 畫面中間不顯示視頻來源的名稱。
這個控件用于在畫面中操作相機的移動等。
6.5獲取無人機的飛行狀態
*注:只有在SDK與與無人機連接成功,并且飛行的時候 才能有相應的高度經緯度信息。
//設置監聽
MApplication.getAircraftInstance().getFlightController().setStateCallback(new FlightControllerState.Callback() {
@Override
public void onUpdate(@NonNull final FlightControllerState flightControllerState) {
runOnUiThread(new Runnable() {
@Override
public void run() {
OnUpdateDJIView(flightControllerState);
}
});
}
});
private void OnUpdateDJIView(FlightControllerState flightControllerState) {
LocationCoordinate3D locationCoordinate3D = flightControllerState.getAircraftLocation();//飛機的3D位置
if (locationCoordinate3D == null) {
printLOG("locationCoordinate3D==null");
return;
}
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("經度:" + locationCoordinate3D.getLongitude()).append("\n");
stringBuffer.append("緯度:" + locationCoordinate3D.getLatitude()).append("\n");
stringBuffer.append("高度:" + locationCoordinate3D.getAltitude()).append(" m\n");
//tv_feiji_infos.setText(stringBuffer.toString());
}
##未完待續..
總結
以上是生活随笔為你收集整理的android大疆飞控界面,DJI Android SDK 开发笔记(入门篇)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 割完双眼皮一个月眼睛还是红红的怎么回事
- 下一篇: 定做牙套要多久