几度风 發表於 2019-7-17 12:26:00

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>&lt;uses-permission android:name="android.permission.BLUETOOTH" /&gt;
&lt;uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /&gt;
&lt;uses-permission android:name="android.permission.VIBRATE" /&gt;
&lt;uses-permission android:name="android.permission.INTERNET" /&gt;
&lt;uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /&gt;
&lt;uses-permission android:name="android.permission.WAKE_LOCK" /&gt;
&lt;uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /&gt;
&lt;uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /&gt;
&lt;uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /&gt;
&lt;uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /&gt;
&lt;uses-permission
    android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
    tools:ignore="ProtectedPermissions" /&gt;
&lt;uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /&gt;
&lt;uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /&gt;
&lt;uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /&gt;
&lt;uses-permission android:name="android.permission.READ_PHONE_STATE" /&gt;

&lt;uses-feature android:name="android.hardware.camera" /&gt;
&lt;uses-feature android:name="android.hardware.camera.autofocus" /&gt;
&lt;uses-feature
    android:name="android.hardware.usb.host"
    android:required="false" /&gt;
&lt;uses-feature
    android:name="android.hardware.usb.accessory"
    android:required="true" /&gt;
</code></pre>
<h4 id="application里面">application里面</h4>
<pre><code>&lt;uses-library android:name="com.android.future.usb.accessory" /&gt;
    &lt;meta-data
      android:name="com.dji.sdk.API_KEY"
      android:value="9a13028ed03500ad035980f9" /&gt;
    &lt;activity
      android:name="dji.sdk.sdkmanager.DJIAoaControllerActivity"
      android:theme="@android:style/Theme.Translucent"&gt;
      &lt;intent-filter&gt;
            &lt;action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" /&gt;
      &lt;/intent-filter&gt;
      &lt;meta-data
            android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"
            android:resource="@xml/accessory_filter" /&gt;
    &lt;/activity&gt;
    &lt;service android:name="dji.sdk.sdkmanager.DJIGlobalService" /&gt;
</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&lt;UserAccountState&gt;() {
      @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&lt;String&gt;() {
      @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>&lt;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" /&gt;

&lt;dji.ux.widget.FPVOverlayWidget
      android:id="@+id/fPVOverlayWidget"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:layout_gravity="center" /&gt;
</code></pre>
<ul>
<li>dji.ux.widget.FPVWidget<br>
<br>这个控件用户显示飞控的相机的画面,DJI已经绑定,直接用即可。<br>
<br>custom:sourceCameraNameVisibility="false"<br>
<br>此属性用设置 画面中间不显示视频来源的名称。</li>
<li>&lt;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]
查看完整版本: DJI Android SDK 开发笔记(入门篇)