运行MSDK注意事项

2022-09-27
暂无评分

本节介绍如何将MSDK V5 Sample中的 MSDK 包和 UXSDK 开源框架移植到用户的空白的项目中。用户需要根据实际版本自行适配整个集成过程。

新建空白项目

  1. 在Android Studio 启动页,选择 New Project > Phone and Tablet > Empty Activity
  2. 完成配置。
    • Name:My Application
    • Package name:com.dji.myapplication
    • Minimum SDK:API 23:Android 6.0 (Marshmallow)

调用install函数

  1. 新建MyApplication.java文件。
  2. 参照 MSDK V5 Sample 的DJIAllApplicationopen in new window编辑成如下内容。
package com.dji.myapplication;

import android.app.Application;
import android.content.Context;

public class MyApplication extends Application {

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        com.secneo.sdk.Helper.install(this);
    }
}

修改build.gradle(Project)文件

在allprojects项的repositories标签下添加

maven { url 'https://s3.amazonaws.com/repo.commonsware.com' }

修改build.gradle(Module)文件

  1. 在dependencies项里添加 MSDK 飞行器依赖包。
implementation 'com.dji:dji-sdk-v5-aircraft:{sdkVersion}'
compileOnly 'com.dji:dji-sdk-v5-aircraft-provided:{sdkVersion}'

说明:

  • dji-sdk-v5-aircraft:飞机主包,提供MSDK对飞机控制的支持。
  • dji-sdk-v5-aircraft-provided:飞机编译包,提供飞机包相关接口。
  1. 在android项里添加packagingOptions和configurations。
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"
    doNotStrip "*/*/libDJICommonJNI.so"
    doNotStrip "*/*/libDJICSDKCommon.so"
    doNotStrip "*/*/libDJIUpgradeCore.so"
    doNotStrip "*/*/libDJIUpgradeJNI.so"
    doNotStrip "*/*/libDJIWaypointV2Core.so"
    doNotStrip "*/*/libAMapSDK_MAP_v6_9_2.so"
    doNotStrip "*/*/libDJIMOP.so"
    doNotStrip "*/*/libDJISDKLOGJNI.so"
    exclude 'META-INF/rxjava.properties'
    exclude 'assets/location_map_gps_locked.png'
    exclude 'assets/location_map_gps_3d.png'
}
configurations {
    cleanedAnnotations
    implementation.exclude group: 'org.jetbrains' , module:'annotations'
}
  1. 拷贝sample.pro文件open in new window的内容复制到你的项目中的proguard-rules文件中。

修改AndroidManifest.xml文件

  1. 参照 MSDK V5 Sample 的AndroidManifest.xmlopen in new window添加SDK需要的权限。
<uses-permission android:name="android.permission.BLUETOOTH" /><!--蓝牙权限,蓝牙场景需要-->
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /><!--蓝牙权限,蓝牙场景需要-->
<uses-permission android:name="android.permission.VIBRATE" /><!--UX震动权限,用于部分震动提示-->
<uses-permission android:name="android.permission.INTERNET" /><!--网络权限,用于SDK网络访问-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><!--网络状态权限,用于SDK网络状态监听-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><!--位置权限,用于SDK确认位置-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><!--网络状态权限,用于SDK网络状态监听-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><!--位置权限,用于SDK确认位置-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /><!--网络状态权限,用于SDK网络状态监听-->
<uses-permission android:name="android.permission.RECORD_AUDIO" /><!--Sample用于音频录制-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><!--SDK读取场景使用-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><!--SDK读取场景使用-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" /><!--用于SDK读取手机配置-->
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/><!--SDK严重异常时使用-->
  1. 参照 MSDK V5 Sample 的AndroidManifest.xmlopen in new window添加USB相关权限,为了连接遥控器使用。
<uses-feature
    android:name="android.hardware.usb.host"
    android:required="false"/>
<uses-feature
    android:name="android.hardware.usb.accessory"
    android:required="true"/>
  1. 在application标签下添加Myapplication文件的声明,启动得时候需要加载。
<application
    android:name="com.dji.myapplication.MyApplication"
  1. 参照 MSDK V5 Sample 的AndroidManifest.xmlopen in new window添加SDK API KEY。用户需要使用工程中的AndroidManifest.xml中的package,前往开发者网站申请appkeyopen in new window,成功后将appkey替换如下代码段中的X

    本指导中 package="com.dji.myapplication"。申请appkey时,bundle identifier需填写com.dji.myapplication
<meta-data
    android:name="com.dji.sdk.API_KEY"
    android:value="X"/>
  1. 在activity标签下添加intent-filter和meta-data。
<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

<meta-data
    android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"
    android:resource="@xml/accessory_filter" />

添加MSDK的init函数

修改MainActivity.java文件

package com.dji.myapplication;

import androidx.appcompat.app.AppCompatActivity;
import dji.v5.common.error.IDJIError;
import dji.v5.common.register.DJISDKInitEvent;
import dji.v5.manager.SDKManager;
import dji.v5.manager.interfaces.SDKManagerCallback;

import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "myApp";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        registerApp();
    }

    private void registerApp() {
        SDKManager.getInstance().init(this, new SDKManagerCallback() {

            @Override
            public void onRegisterSuccess() {
                Log.e(TAG, "myApp onRegisterSuccess");
            }

            @Override
            public void onRegisterFailure(IDJIError error) {
                Log.e(TAG, "myApp onRegisterFailure");
            }

            @Override
            public void onProductDisconnect(int productId) {
                Log.e(TAG, "myApp onProductDisconnect");
            }

            @Override
            public void onProductConnect(int productId) {
                Log.e(TAG, "myApp onProductConnect");
            }

            @Override
            public void onProductChanged(int productId) {
                Log.e(TAG, "myApp onProductChanged");
            }

            @Override
            public void onInitProcess(DJISDKInitEvent event, int totalProcess) {
                Log.e(TAG, "myApp onInitProcess");
                if (event == DJISDKInitEvent.INITIALIZE_COMPLETE) {
                    Log.e(TAG, "myApp start registerApp");
                    SDKManager.getInstance().registerApp();
                }
            }

            @Override
            public void onDatabaseDownloadProgress(long current, long total) {
                Log.e(TAG, "myApp onDatabaseDownloadProgress ");
            }
        });
    }
}

导入UXSDK开源框架

  1. 将UXSDK项目(android-sdk-v5-uxsdkopen in new window)复制到用户的项目路径下。
  2. 将其build.gradle文件中所有对原项目的配置取消,并且直接声明引用,例如android和dependecies里面的内容需要全部修改成本地化。
android {
    compileSdkVersion Integer.parseInt(project.ANDROID_COMPILE_SDK_VERSION)

    resourcePrefix "uxsdk_"
    defaultConfig {
        minSdkVersion Integer.parseInt(project.ANDROID_MIN_SDK_VERSION)
        targetSdkVersion Integer.parseInt(project.ANDROID_TARGET_SDK_VERSION)
        versionCode 1
        versionName "1.0"
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    kotlinOptions{
        jvmTarget = JavaVersion.VERSION_1_8
    }
}

dependencies {
    implementation deps.annotation
    implementation deps.appcompat
    implementation deps.multidex
    implementation deps.legacySupport
    implementation deps.recyclerview
    implementation deps.okio
    implementation deps.wire
    implementation deps.constraintLayout
    implementation deps.lifecycleJava8
    implementation deps.lifecycleRuntime
    implementation deps.lifecycleProcess
    implementation deps.media
    implementation deps.kotlinLib
    implementation deps.ktxCore
    implementation deps.rx3Android
    implementation deps.rx3Java

    api deps.maplibreAnotation
    api deps.maplibreTurf
    api deps.maplibreSdk
    api deps.amap3DMap
    api deps.amapSearch

    api deps.playservicesplaces
    api deps.playservicesmaps
    api deps.playserviceslocation
    api deps.playservicesbase

    compileOnly deps.aircraftProvided
    compileOnly deps.aircraft

    api files("../android-sdk-v5-as/libs/map/DJI-Mapkit-Amap.aar")
    api files("../android-sdk-v5-as/libs/map/DJI-Mapkit-Core.aar")
    api files("../android-sdk-v5-as/libs/map/DJI-Mapkit-Maplibre.aar")
    api files("../android-sdk-v5-as/libs/map/DJI-Mapkit-Google.aar")
}
  1. 在settings.gradle里添加对模块依赖。
include ':uxsdk'// uxsdk模块
project(':uxsdk').projectDir = new File(rootProject.projectDir, '../android-sdk-v5-uxsdk')
  1. 同步工程。
<meta-data
    android:name="com.dji.sdk.API_KEY"
    android:value="X"/>

若您不是从空白工程开始合入MSDK代码,请额外增加如下的检查项。

检查 "build.gradle" 文件中的 buildTypes 参数

确保 shrinkResources 为false,以防止资源压缩。点击查看参考"build.gradle" 文件open in new window

buildTypes 当前内容展示如下:

    buildTypes {
        release {
            minifyEnabled true
            shrinkResources false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), '../../android-sdk-v5-as/proguard-relative/sample.pro'
        }
        debug {
            minifyEnabled true
            shrinkResources false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), '../../android-sdk-v5-as/proguard-relative/sample.pro'
        }
    }

检查 "build.gradle" 文件中的 android 参数

确保“arm64-v8a”安卓平台的指定。当前”armeabi-v7a“暂不支持。点击查看参考"build.gradle" 文件open in new window

android 当前内容展示如下:

android {
    compileSdkVersion Integer.parseInt(project.ANDROID_COMPILE_SDK_VERSION)

    defaultConfig {
        applicationId "com.dji.sampleV5.aircraft"
        minSdkVersion Integer.parseInt(project.ANDROID_MIN_SDK_VERSION)
        targetSdkVersion Integer.parseInt(project.ANDROID_TARGET_SDK_VERSION)
        versionCode 1
        versionName "1.0"
        manifestPlaceholders["API_KEY"] = project.AIRCRAFT_API_KEY

        ndk {
            abiFilters 'arm64-v8a'
        }
    }