先看效果图吧:
1.大疆无人机官方文档地址:https://developer.dji.com/mobile-sdk/,我们做这个无人机开发1,需要先去大疆官网看文档,然后申请一个大疆账号,然后去申请appkey,注意这个appkey很重要。不申请的无法运行
2.配置环境,添加依赖,在app下面的builder.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 28
buildToolsVersion "28.0.1"
defaultConfig {
applicationId "com.example.administrator.testz"
minSdkVersion 19
targetSdkVersion 28
versionCode 1
versionName "1.0"
multiDexEnabled true
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
ndk {
abiFilters 'armeabi-v7a'
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
packagingOptions {
exclude 'META-INF/rxjava.properties'
}
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"
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
implementation 'com.android.support:appcompat-v7:26.0.0-alpha1'
testImplementation 'junit:junit:4.12'
//====dividing
implementation 'com.android.support:multidex:1.0.1'
// dividing
implementation 'com.dji:dji-sdk:4.8.1'
implementation 'com.dji:dji-uxsdk:4.8.1'
compileOnly 'com.dji:dji-sdk-provided:4.8.1'
}
2.清单文件,注意清单文件我写注释的地方,那个很重要,还有就是appkey,你们需要自己去注册
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.administrator.testz">
<!-- 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-feature
android:name="android.hardware.usb.host"
android:required="false" />
<uses-feature
android:name="android.hardware.usb.accessory"
android:required="true" />
<!-- SDK requirement permission end -->
<application
android:name=".MApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<!-- DJI SDK -->
<uses-library android:name="com.android.future.usb.accessory" />
<meta-data
android:name="com.dji.sdk.API_KEY"
android:value="your app key" />
<activity
android:name="dji.sdk.sdkmanager.DJIAoaControllerActivity"
android:theme="@android:style/Theme.Translucent" >
</activity>
<service android:name="dji.sdk.sdkmanager.DJIGlobalService" >
</service>
<!-- DJI SDK -->
<activity android:name=".ConnectionActivity"
android:configChanges="orientation"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<!--这个是点击usb配件弹框 要启动的activity-->
<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>
<activity android:name=".MainActivity"
android:screenOrientation="landscape"></activity>
<activity android:name=".BattryActivity"
android:screenOrientation="landscape"></activity>
</application>
</manifest>
3.验证无人机环境
package com.example.administrator.testz;
import android.app.Application;
import android.content.Context;
import com.secneo.sdk.Helper;
/**
* Created by wrs on 2019/6/4,10:47
* projectName: Testz
* packageName: com.example.administrator.testz
*/
public class MApplication extends Application {
private FPVDemoApplication fpvDemoApplication;
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
Helper.install(MApplication.this);
if (fpvDemoApplication == null) {
fpvDemoApplication = new FPVDemoApplication();
fpvDemoApplication.setContext(this);
}
}
@Override
public void onCreate() {
super.onCreate();
fpvDemoApplication.onCreate();
}
}
4.无人机绑定注册
package com.example.administrator.testz;
import android.app.Application;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import android.support.v4.content.ContextCompat;
import android.util.Log;
import android.widget.Toast;
import dji.common.error.DJIError;
import dji.common.error.DJISDKError;
import dji.sdk.base.BaseComponent;
import dji.sdk.base.BaseProduct;
import dji.sdk.battery.Battery;
import dji.sdk.camera.Camera;
import dji.sdk.products.Aircraft;
import dji.sdk.products.HandHeld;
import dji.sdk.sdkmanager.DJISDKManager;
/**
* Created by wrs on 2019/6/4,10:49
* projectName: Testz
* packageName: com.example.administrator.testz
*/
public class FPVDemoApplication extends Application {
public static final String FLAG_CONNECTION_CHANGE = "fpv_tutorial_connection_change";
private DJISDKManager.SDKManagerCallback mDJISDKManagerCallback;
private static BaseProduct mProduct;
public Handler mHandler;
private Application instance;
public void setContext(Application application) {
instance = application;
}
@Override
public Context getApplicationContext() {
return instance;
}
public FPVDemoApplication() {
}
/**
* 此函数用于获取DJIBaseProduct的实例。
* 如果没有连接产品,则返回null。
*/
public static synchronized BaseProduct getProductInstance() {
if (null == mProduct) {
mProduct = DJISDKManager.getInstance().getProduct();
}
return mProduct;
}
//电池
public static synchronized Battery getBatteryInstance(){
if (getProductInstance() == null){
return null;
}
Battery battery = null;
BaseProduct productInstance = getProductInstance();
if (productInstance instanceof Aircraft){
battery = ((Aircraft)productInstance).getBattery();
//手持云台
}else if (productInstance instanceof HandHeld){
}
return battery;
}
//相机
public static synchronized Camera getCameraInstance() {
if (getProductInstance() == null) {
return null;
}
Camera camera = null;
if (getProductInstance() instanceof Aircraft) {
camera = ((Aircraft) getProductInstance()).getCamera();
} else if (getProductInstance() instanceof HandHeld) {
camera = ((HandHeld) getProductInstance()).getCamera();
}
return camera;
}
@Override
public void onCreate() {
super.onCreate();
mHandler = new Handler(Looper.getMainLooper());
/**
* 启动SDK服务时,将使用接口DJISDKManager.DJISDKManagerCallback的实例进行监听
SDK注册结果和产品更改。
*/
mDJISDKManagerCallback = new DJISDKManager.SDKManagerCallback() {
//Listens to the SDK registration result
@Override
public void onRegister(DJIError djiError) {
if (djiError== DJISDKError.REGISTRATION_SUCCESS){
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
//注册成功
Toast.makeText(getApplicationContext(), "Register Success", Toast.LENGTH_LONG).show();
}
});
DJISDKManager.getInstance().startConnectionToProduct();
}else{
Handler handler = new Handler(Looper.getMainLooper())