DJI Android SDK 开发笔记(入门篇)
<h2 id="大疆sdk开发笔记">大疆SDK开发笔记##</h2><h1 id="1文档相关">1.文档相关</h1>
<ul>
<li>
<p>1.大疆SDK首页</p>
</li>
<li>
<p>2.Android SDK文档<br>
<br>接入Android的SDK都在这部分,飞控相关的接口。</p>
</li>
<li>
<p>3.Android UX SDK文档<br>
<br> 大疆自定义的组件,已经跟飞机关联,直接用即可。</p>
</li>
<li>
<p>4.官方Git库<br>
<br> 相关Demo都在里面</p>
</li>
<li>
<p>5.注册成为开发者<br>
<br><br>
开发者注册<br>
<br>注:每一个Android应用都要注册APPkey,否则调用不了SDK。</p>
</li>
<li>
<p>6.Mobile-UXSDK-Android 结合的Demo(飞控界面)<br>
<br>地址下载</p>
</li>
</ul>
<h1 id="2飞行模拟器下载地址">2.飞行模拟器下载地址</h1>
<p>Mavic 系列模拟器下载地址</p>
<p>Phantom 系列模拟器下载地址</p>
<p>Assistant 系列模拟器下载地址</p>
<h1 id="3android-sdk">3.Android SDK</h1>
<p><img src="https://images.cnblogs.com/cnblogs_com/jiangtuanyuan/1505293/o_DJI%20Android%20SDK2.png" alt="" loading="lazy"></p>
<p>预览大图</p>
<h1 id="4android-ux-sdk">4.Android UX SDK</h1>
<p><img src="https://images.cnblogs.com/cnblogs_com/jiangtuanyuan/1505293/o_DJI%20Android%20UX%20SDK.png" alt="" loading="lazy"></p>
<p>预览大图</p>
<h1 id="5android-studio接入dij-sdk步骤">5.Android Studio接入DIJ SDK步骤</h1>
<h3 id="51app的buildgradle添加">5.1.app的build.gradle添加</h3>
<pre><code>implementation 'com.dji:dji-sdk:4.10'
implementation 'com.dji:dji-uxsdk:4.10'
compileOnly 'com.dji:dji-sdk-provided:4.10'
</code></pre>
<h3 id="52app的buildgradle的android中">5.2.app的build.gradle的android中</h3>
<pre><code>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'
}
</code></pre>
<h3 id="53-androidmanifestxml添加权限">5.3 AndroidManifest.xml添加权限</h3>
<pre><code><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"
tools:ignore="ProtectedPermissions" />
<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-feature
android:name="android.hardware.usb.host"
android:required="false" />
<uses-feature
android:name="android.hardware.usb.accessory"
android:required="true" />
</code></pre>
<h4 id="application里面">application里面</h4>
<pre><code><uses-library android:name="com.android.future.usb.accessory" />
<meta-data
android:name="com.dji.sdk.API_KEY"
android:value="9a13028ed03500ad035980f9" />
<activity
android:name="dji.sdk.sdkmanager.DJIAoaControllerActivity"
android:theme="@android:style/Theme.Translucent">
<intent-filter>
<action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />
</intent-filter>
<meta-data
android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"
android:resource="@xml/accessory_filter" />
</activity>
<service android:name="dji.sdk.sdkmanager.DJIGlobalService" />
</code></pre>
<h1 id="6sdk初始化以及接口相关">6.SDK初始化以及接口相关</h1>
<p><span style="color: rgba(255, 0, 0, 1)">*注:DJI的相关回调都在子线程里面!请勿在操作UI。</span></p>
<h3 id="61初始化sdk">6.1初始化SDK</h3>
<pre><code> 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);
}
</code></pre>
<h3 id="62登录dji账号">6.2登录DJI账号</h3>
<pre><code>private void DJIUserLogin() {
UserAccountManager.getInstance().logIntoDJIUserAccount(MainActivity.this, new CommonCallbacks.CompletionCallbackWith<UserAccountState>() {
@Override
public void onSuccess(final UserAccountState userAccountState) {
//登录成功的回调 子线程回调
}
@Override
public void onFailure(final DJIError djiError) {
//登录失败的错误回调
}
});
}
</code></pre>
<h3 id="63获取登录dji账号相关的信息">6.3获取登录DJI账号相关的信息</h3>
<pre><code>private void getDjiLoginUserName() {
UserAccountManager.getInstance().getLoggedInDJIUserAccountName(new CommonCallbacks.CompletionCallbackWith<String>() {
@Override
public void onSuccess(final String s) {
//s为登录的用户名
}
@Override
public void onFailure(final DJIError djiError) {
//获取失败 错误详情请查看djierror类
}
});
}
</code></pre>
<p>*注:完成以上的注册SDK、和登录用户名后,就能进入到正式DJI SDK开发了。</p>
<h3 id="64-xml布局文件">6.4 XML布局文件</h3>
<pre><code><dji.ux.widget.FPVWidget
android:id="@+id/fpvwidget"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
custom:sourceCameraNameVisibility="false" />
<dji.ux.widget.FPVOverlayWidget
android:id="@+id/fPVOverlayWidget"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center" />
</code></pre>
<ul>
<li>dji.ux.widget.FPVWidget<br>
<br>这个控件用户显示飞控的相机的画面,DJI已经绑定,直接用即可。<br>
<br>custom:sourceCameraNameVisibility="false"<br>
<br>此属性用设置 画面中间不显示视频来源的名称。</li>
<li><dji.ux.widget.FPVOverlayWidget<br>
<br>这个控件用于在画面中操作相机的移动等。</li>
</ul>
<h3 id="65获取无人机的飞行状态">6.5获取无人机的飞行状态</h3>
<p>*注:只有在SDK与与无人机连接成功,并且飞行的时候 才能有相应的高度经纬度信息。</p>
<pre><code>//设置监听
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());
}
</code></pre>
<h2 id="未完待续">未完待续..</h2>
</div>
<div id="MySignature" role="contentinfo">
A good Man<br><br>
来源:https://www.cnblogs.com/jiangtuanyuan/p/11200240.html
頁:
[1]