在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            博客專欄

            EEPW首頁(yè) > 博客 > 基于Mobile SDK V4版固件開(kāi)發(fā)大疆無(wú)人機(jī)手機(jī)端遙控器(1)

            基于Mobile SDK V4版固件開(kāi)發(fā)大疆無(wú)人機(jī)手機(jī)端遙控器(1)

            發(fā)布人:美男子玩編程 時(shí)間:2023-06-09 來(lái)源:工程師 發(fā)布文章

            剛剛結(jié)束了項(xiàng)目交付,趁熱打鐵分享一下這次遇到的新東西。首先了解一下大疆的無(wú)人機(jī),它大致可以分為三級(jí)。

            • 入門級(jí):適合新手,沒(méi)事干在野外飛一飛拍拍風(fēng)景啥的。操作也簡(jiǎn)單,基本上看飛行教程都能懂,也不需要太高的專業(yè)性,飛機(jī)也相對(duì)較小安全系數(shù)相對(duì)較高。如:御2系列的一些飛機(jī)。

            • 消費(fèi)級(jí):形體上會(huì)比入門級(jí)的大一點(diǎn),但是飛機(jī)搭載了一些高精度的東西,比如RTK、高精度攝像頭、紅外鏡頭等。這類飛機(jī)則需要飛手具備一定的專業(yè)知識(shí),并且需要考取大疆的初級(jí)飛手證書才能上手飛行。如:精靈系列、悟系列的一些飛機(jī)。

            • 專業(yè)級(jí):形體上更大,操作不當(dāng)會(huì)出現(xiàn)一些嚴(yán)重后果。它的優(yōu)勢(shì)在于高續(xù)航、高精度定位、熱成像鏡頭、搭載第三方喊話器等。一般用于大型工程作業(yè),使用這個(gè)級(jí)別的飛機(jī)則需要考取大疆專業(yè)飛手證書,一般這個(gè)會(huì)在你購(gòu)買專業(yè)級(jí)飛機(jī)的時(shí)候贈(zèng)送你培訓(xùn)課程,一般全部聽(tīng)完就能考過(guò)。這類飛機(jī)的典型代表有:M30系列、M300系列。

            1

            SDK開(kāi)發(fā)包

            大疆的SDK開(kāi)發(fā)包目前分為兩個(gè)大版本:

            v4版

            Mobile SDK是一款軟件開(kāi)發(fā)套件,旨在讓開(kāi)發(fā)者能夠訪問(wèn)DJI無(wú)人機(jī)和手持相機(jī)產(chǎn)品的豐富功能。該SDK通過(guò)兼顧更底層的功能,諸如飛行穩(wěn)定,電池管理,信號(hào)傳輸和通信等,簡(jiǎn)化了應(yīng)用程序開(kāi)發(fā)的過(guò)程。這樣,開(kāi)發(fā)者就不需要具備豐富的機(jī)器人或嵌入式系統(tǒng)背景知識(shí),而可以專注于DJI產(chǎn)品相關(guān)的行業(yè)應(yīng)用開(kāi)發(fā)。

            該SDK包括:

            • 可導(dǎo)入Android或iOS應(yīng)用程序的庫(kù)/框架,用于訪問(wèn)DJI產(chǎn)品的功能。
            • 飛行模擬器和可視化工具。
            • 適用于iOS的調(diào)試工具和遠(yuǎn)程logger。
            • 示例代碼和教程。
            • 開(kāi)發(fā)者指南和API文檔。

            功能概述

            開(kāi)發(fā)者可以通過(guò)SDK訪問(wèn)許多DJI產(chǎn)品的功能。開(kāi)發(fā)者可以實(shí)現(xiàn)自主飛行,控制相機(jī)和云臺(tái),接收實(shí)時(shí)視頻圖傳和傳感器數(shù)據(jù),下載保存好的媒體文件,以及監(jiān)聽(tīng)其他組件的狀態(tài)。

            飛行控制

            Mobile SDK提供三種控制無(wú)人機(jī)飛行的方式:

            • 手動(dòng)操控: 用戶使用遙控器操控?zé)o人機(jī),而SDK支持監(jiān)控實(shí)時(shí)視頻流和傳感器數(shù)據(jù)。虛擬搖桿命令: SDK支持產(chǎn)生模擬遙控器搖桿的控制指令。

            • 智能任務(wù): 方便,易于實(shí)現(xiàn)無(wú)人機(jī)的高級(jí)控制。例如,可以通過(guò)航點(diǎn)任務(wù),讓無(wú)人機(jī)按預(yù)定義的飛行路徑飛行。

            • 虛擬搖桿命令和智能任務(wù)允許對(duì)DJI無(wú)人機(jī)進(jìn)行簡(jiǎn)單而功能強(qiáng)大的自主飛行控制。

            相機(jī)

            相機(jī)和云臺(tái)的功能都支持編程調(diào)用, 例如:

            • 相機(jī)模式: 視頻和靜態(tài)圖像拍攝。

            • 曝光: 快門,ISO,光圈和曝光補(bǔ)償均支持定制,以實(shí)現(xiàn)最大的靈活性。

            • 圖像參數(shù): 屏幕長(zhǎng)寬比,對(duì)比度,色相,清晰度,飽和度和濾鏡。

            • 視頻參數(shù): 分辨率和幀頻。

            • 方向: 使用云臺(tái)時(shí),相機(jī)的朝向和運(yùn)動(dòng)可以自動(dòng)控制。

            實(shí)時(shí)視頻流

            開(kāi)發(fā)者可以通過(guò)Mobile SDK獲取無(wú)人機(jī)主攝像頭的實(shí)時(shí)視頻流。即使攝像頭正在將圖像或視頻捕獲到存儲(chǔ)介質(zhì)中,也可以獲取實(shí)時(shí)視頻流。

            傳感器數(shù)據(jù)

            開(kāi)發(fā)者可以通過(guò)SDK獲得豐富的傳感器數(shù)據(jù)。GPS位置,指南針,氣壓計(jì),飛行速度和海拔高度都是通過(guò)Mobile SDK獲取的一些傳感器數(shù)據(jù),頻率最高可達(dá)10 Hz。

            下載媒體文件

            開(kāi)發(fā)者通過(guò)Mobile SDK可以查看和下載保存在相機(jī)存儲(chǔ)介質(zhì)(SD卡或固態(tài)硬盤)中的照片和視頻。預(yù)覽圖和完整的圖像數(shù)據(jù)都可以被訪問(wèn)。

            遙控器,電池和無(wú)線鏈路

            遙控器,電池和無(wú)線鏈路都可以通過(guò)SDK進(jìn)行訪問(wèn)。通常,這些組件會(huì)提供相關(guān)的狀態(tài)信息,但開(kāi)發(fā)者也可以對(duì)它們進(jìn)行一些控制。

            連接應(yīng)用程序和產(chǎn)品

            下圖說(shuō)明了Mobile SDK如何與移動(dòng)應(yīng)用程序進(jìn)行融合以及如何與DJI飛行器進(jìn)行連接。

            圖片

            對(duì)于手持?jǐn)z像機(jī)產(chǎn)品,遙控器已替換為手持控制器,并且沒(méi)有飛行器或其他無(wú)線鏈路。


            移動(dòng)應(yīng)用程序由Mobile SDK,平臺(tái)SDK(iOS或Android)構(gòu)建而成,并在移動(dòng)設(shè)備(Apple iPhone,iPad,Nexus手機(jī),Nexus平板電腦等)上運(yùn)行。

            移動(dòng)設(shè)備可以通過(guò)WiFi無(wú)線連接到DJI產(chǎn)品上,也可以通過(guò)USB線纜連接到DJI產(chǎn)品上。

            v5版

            v5版現(xiàn)在只適用于M30、M300系列,目前還在持續(xù)更新,因?yàn)槭切掳娴腟DK,大疆的工程師也是在不斷地再完善里面的內(nèi)容,這里就不詳細(xì)說(shuō)了,之后的文章會(huì)詳細(xì)說(shuō)這個(gè)v5版的SDK。

            2

            V4版SDK 二次開(kāi)發(fā)

            多的不說(shuō)少的不嘮,上主菜。“工欲善其事,必先利其器”,首先準(zhǔn)備好開(kāi)發(fā)軟件,因?yàn)槲覀兪褂玫氖茿ndroid版的SDK所以開(kāi)發(fā)軟件我們使用Android Studio,本人使用的是Android Studio Fox版,版本之間感覺(jué)都一樣沒(méi)有什么開(kāi)發(fā)上的區(qū)別。準(zhǔn)備好工具之后,先去大疆無(wú)人機(jī)的開(kāi)發(fā)者官網(wǎng)注冊(cè)一個(gè)開(kāi)發(fā)者賬號(hào),并且注冊(cè)好自己的應(yīng)用,拿到sdk的專用Key值,申請(qǐng)的方法大疆官網(wǎng)有我就不贅述了。給大家個(gè)地址【大疆開(kāi)發(fā)者官網(wǎng)】自己看吧,挺簡(jiǎn)單的。

            注冊(cè)成為DJI開(kāi)發(fā)者

            在注冊(cè)過(guò)程中,需要您提供電子郵件信息和****或手機(jī)號(hào)碼用于注冊(cè)驗(yàn)證。您所提供的任何****信息將僅用于驗(yàn)證,不會(huì)收取任何費(fèi)用。

            本指南假定您使用 Xcode 7.3 以及 Android Studio 2.1.1 以上版本。

            生成 App Key

            每個(gè)應(yīng)用程序都需要一個(gè)唯一的應(yīng)用程序密鑰(App Key)來(lái)初始化SDK。

            要?jiǎng)?chuàng)建一個(gè)應(yīng)用程序App Key:

            請(qǐng)?jiān)L問(wèn)DJI開(kāi)發(fā)者網(wǎng)站的 開(kāi)發(fā)者中心

            • 選擇左側(cè)欄的 "應(yīng)用 "。
            • 選擇右側(cè)的 “創(chuàng)建應(yīng)用” 按鈕。
            • 輸入應(yīng)用程序的名稱, 開(kāi)發(fā)平臺(tái), Package Name,分類和描述信息。
            • 會(huì)收到一封應(yīng)用程序激活郵件,以完成App Key的生成。
            • 可以在開(kāi)發(fā)者中心中找到AppKey,復(fù)制粘貼到應(yīng)用程序配置中。

            Android 示例代碼配置

            下載或者克隆Github上的Android示例代碼工程。

            在Android Studio中打開(kāi)項(xiàng)目工程,將生成的App Key字符串粘貼到 "AndroidManifest.xml" 文件中 "com.dji.sdk.API_KEY" meda-data element下的 android:value。

            <!--
                ADD API_KEY HERE and make sure you
                are connected to the Internet before
                the app is launched
            -->
            <meta-data
                android:name="com.dji.sdk.API_KEY"
                android:value="" />

            3

            Android Studio項(xiàng)目集成

            本節(jié)中的屏幕截圖是使用Android Studio 4.1生成的。

            創(chuàng)建一個(gè)新的應(yīng)用

            可以使用一個(gè)新的應(yīng)用程序來(lái)演示如何將DJI SDK集成到Android Studio項(xiàng)目中。

            • 打開(kāi)Android Studio,然后在初始屏幕上選擇Start a new Android Studio project

            圖片


            • 在 New Project 界面:
              • 設(shè)置 Application name 為 "ImportSDKDemo"。
              • 設(shè)置 Company Domain 和Package name 為 "com.dji.ImportSDKDemo"。


            注意:Package name是 生成App Key 所需的標(biāo)識(shí)字符串。在這個(gè)工程中Package name為“com.dji.ImportSDKDemo”

            • 在 Target Android Devices 界面:

              • 選擇 Phone and Tablet 尺寸。
              • 選擇API 23:Android 6.0 (Marshmallow)。

              圖片

            • 在 Add an Activity to Mobile 界面選擇 Empty Activity。

            圖片


            • 在Configure Activity 界面:
            • 設(shè)置 Activity Name: 為 "MainActivity"。
            • 確認(rèn)勾選Generate Layout File 。
            • 設(shè)置Layout Name: 為"activity_main"。
            • 點(diǎn)擊Finish 。

              圖片

            配置Gradle 腳本

            • 在Gradle Scripts 中雙擊 build.gradle (Module: app)

              圖片

            使用以下內(nèi)容進(jìn)行更新:

            apply plugin: 'com.android.application'
            android {
                ...
                defaultConfig {
                    ...
                }
                ...
                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"
                    exclude 'META-INF/rxjava.properties'
                }
            }
            dependencies {
               ...
                implementation('com.dji:dji-sdk:4.15', {
                
                exclude module'library-anti-distortion'
                
                })
              compileOnly 'com.dji:dji-sdk-provided:4.15
            }

            主要變更為:

            • 添加 packagingOptions以防止應(yīng)用程序意外崩潰。

            • 添加compile和provided依賴項(xiàng)以導(dǎo)入最新的DJIAndroid SDK Maven依賴項(xiàng)。


            圖片


              選擇 Tools -> Android -> Sync Project with Gradle Files 然后等待Gradle項(xiàng)目同步完成。
            • 再次確認(rèn) Maven 依賴

              • 在Android Studio菜單中選擇File->Project Structure,以打開(kāi)"Project Structure"界面。然后選擇“app”模塊,然后單擊Dependencies選項(xiàng)卡。

            實(shí)現(xiàn)應(yīng)用注冊(cè)和SDK回調(diào)

            右鍵單擊com.dji.importSDKDemo,然后選擇 New->Java Class以創(chuàng)建一個(gè)新的Java類,并將其命名為“MApplication”。

            圖片


            打開(kāi)MApplication.java文件,并將內(nèi)容替換為以下內(nèi)容:

            package com.dji.importSDKDemo;
            import android.app.Application;
            import android.content.Context;
            import com.secneo.sdk.Helper;
            public class MApplication extends Application {
                @Override
                protected void attachBaseContext(Context paramContext) {
                    super.attachBaseContext(paramContext);
                    Helper.install(MApplication.this);
                }
            }
            • 在這里,重寫了attachBaseContext()方法,添加了Helper.install(MApplication.this);代碼。

            注意:由于某些SDK類現(xiàn)在需要在使用之前進(jìn)行加載,因此加載過(guò)程由Helper.install()完成。開(kāi)發(fā)人員需要在使用任何SDK功能之前調(diào)用此方法, 否則可能會(huì)導(dǎo)致意外崩潰。

            圖片


            修改完成后需要在AndroidManifest中 配置 Application name。

            圖片


            雙擊app模塊中的MainActivity.java。

            圖片


            MainActivity類需要注冊(cè)應(yīng)用程序以獲得使用Mobile SDK的授權(quán)。它還需要實(shí)現(xiàn)SDK回調(diào)方法。

            • 首先將MainActivity類修改為包括幾個(gè)類變量,其中包括mProduct,它是代表連接到移動(dòng)設(shè)備的DJI產(chǎn)品的對(duì)象。
            • 另外,onCreate方法將被修改以調(diào)用checkAndRequestPermissions方法來(lái)檢查和請(qǐng)求運(yùn)行時(shí)權(quán)限。同樣,checkAndRequestPermissions方法將有助于調(diào)用startSDKRegistration()方法來(lái)注冊(cè)應(yīng)用程序。此外,重寫onRequestPermissionsResult方法將有助于檢查應(yīng)用程序是否具有足夠的權(quán)限,如果有,請(qǐng)調(diào)用startSDKRegistration()方法來(lái)注冊(cè)應(yīng)用程序。
            • 最后,將MainActivity類替換為:
            public class MainActivity extends AppCompatActivity {
                private static final String TAG = MainActivity.class.getName();
                public static final String FLAG_CONNECTION_CHANGE = "dji_sdk_connection_change";
                private static BaseProduct mProduct;
                private Handler mHandler;
                private static final String[] REQUIRED_PERMISSION_LIST = new String[]{
                        Manifest.permission.VIBRATE,
                        Manifest.permission.INTERNET,
                        Manifest.permission.ACCESS_WIFI_STATE,
                        Manifest.permission.WAKE_LOCK,
                        Manifest.permission.ACCESS_COARSE_LOCATION,
                        Manifest.permission.ACCESS_NETWORK_STATE,
                        Manifest.permission.ACCESS_FINE_LOCATION,
                        Manifest.permission.CHANGE_WIFI_STATE,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE,
                        Manifest.permission.BLUETOOTH,
                        Manifest.permission.BLUETOOTH_ADMIN,
                        Manifest.permission.READ_EXTERNAL_STORAGE,
                        Manifest.permission.READ_PHONE_STATE,
                };
                private List<String> missingPermission = new ArrayList<>();
                private AtomicBoolean isRegistrationInProgress = new AtomicBoolean(false);
                private static final int REQUEST_PERMISSION_CODE = 12345;
                @Override
                protected void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                    // When the compile and target version is higher than 22, please request the following permission at runtime to ensure the SDK works well.
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                        checkAndRequestPermissions();
                    }
                    setContentView(R.layout.activity_main);
                    //Initialize DJI SDK Manager
                    mHandler = new Handler(Looper.getMainLooper());
                }
                /**
                 * Checks if there is any missing permissions, and
                 * requests runtime permission if needed.
                 */

                private void checkAndRequestPermissions() {
                    // Check for permissions
                    for (String eachPermission : REQUIRED_PERMISSION_LIST) {
                        if (ContextCompat.checkSelfPermission(this, eachPermission) != PackageManager.PERMISSION_GRANTED) {
                            missingPermission.add(eachPermission);
                        }
                    }
                    // Request for missing permissions
                    if (missingPermission.isEmpty()) {
                        startSDKRegistration();
                    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                        showToast("Need to grant the permissions!");
                        ActivityCompat.requestPermissions(this,
                                missingPermission.toArray(new String[missingPermission.size()]),
                                REQUEST_PERMISSION_CODE);
                    }
                }
                /**
                 * Result of runtime permission request
                 */

                @Override
                public void onRequestPermissionsResult(int requestCode,
                                                       @NonNull String[] permissions,
                                                       @NonNull int[] grantResults)
             
            {
                    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
                    // Check for granted permission and remove from missing list
                    if (requestCode == REQUEST_PERMISSION_CODE) {
                        for (int i = grantResults.length - 1; i >= 0; i--) {
                            if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                                missingPermission.remove(permissions[i]);
                            }
                        }
                    }
                    // If there is enough permission, we will start the registration
                    if (missingPermission.isEmpty()) {
                        startSDKRegistration();
                    } else {
                        showToast("Missing permissions!!!");
                    }
                }
            }

            DJISDKManager的registerApp()方法具有一個(gè)回調(diào),該回調(diào)需要處理兩種方法:一、用于處理應(yīng)用程序注冊(cè)結(jié)果。二、用于通知硬件產(chǎn)品和移動(dòng)設(shè)備的連接變更。

            繼續(xù)添加如下所示的 startSDKRegistration() 方法,并實(shí)現(xiàn) onRegister(), onProductDisconnect(), onProductConnect(), onComponentChange(), onInitProcess() and onDatabaseDownloadProgress() 和SDKManagerCallback方法:

            private void startSDKRegistration() {
                if (isRegistrationInProgress.compareAndSet(falsetrue)) {
                    AsyncTask.execute(new Runnable() {
                        @Override
                        public void run() {
                            showToast("registering, pls wait...");
                            DJISDKManager.getInstance().registerApp(MainActivity.this.getApplicationContext(), new DJISDKManager.SDKManagerCallback() {
                                @Override
                                public void onRegister(DJIError djiError) {
                                    if (djiError == DJISDKError.REGISTRATION_SUCCESS) {
                                        showToast("Register Success");
                                        DJISDKManager.getInstance().startConnectionToProduct();
                                    } else {
                                        showToast("Register sdk fails, please check the bundle id and network connection!");
                                    }
                                    Log.v(TAG, djiError.getDescription());
                                }
                                @Override
                                public void onProductDisconnect() {
                                    Log.d(TAG, "onProductDisconnect");
                                    showToast("Product Disconnected");
                                    notifyStatusChange();
                                }
                                @Override
                                public void onProductConnect(BaseProduct baseProduct) {
                                    Log.d(TAG, String.format("onProductConnect newProduct:%s", baseProduct));
                                    showToast("Product Connected");
                                    notifyStatusChange();
                                }
                                @Override
                                public void onComponentChange(BaseProduct.ComponentKey componentKey, BaseComponent oldComponent,
                                                              BaseComponent newComponent)
             
            {
                                    if (newComponent != null) {
                                        newComponent.setComponentListener(new BaseComponent.ComponentListener() {
                                            @Override
                                            public void onConnectivityChange(boolean isConnected) {
                                                Log.d(TAG, "onComponentConnectivityChanged: " + isConnected);
                                                notifyStatusChange();
                                            }
                                        });
                                    }
                                    Log.d(TAG,
                                            String.format("onComponentChange key:%s, oldComponent:%s, newComponent:%s",
                                                    componentKey,
                                                    oldComponent,
                                                    newComponent));
                                }
                                @Override
                                public void onInitProcess(DJISDKInitEvent djisdkInitEvent, int i) {
                                }
                                @Override
                                public void onDatabaseDownloadProgress(long l, long l1) {
                                }
                            });
                        }
                    });
                }
            }

            最后需要實(shí)現(xiàn) notifyStatusChange, Runnable 和 showToast 方法:


            private void notifyStatusChange() {
                mHandler.removeCallbacks(updateRunnable);
                mHandler.postDelayed(updateRunnable, 500);
            }
            private Runnable updateRunnable = new Runnable() {
                @Override
                public void run() {
                    Intent intent = new Intent(FLAG_CONNECTION_CHANGE);
                    sendBroadcast(intent);
                }
            };
            private void showToast(final String toastMsg) {
                Handler handler = new Handler(Looper.getMainLooper());
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(getApplicationContext(), toastMsg, Toast.LENGTH_LONG).show();
                    }
                });
            }

            必須授予應(yīng)用程序權(quán)限,DJI SDK才能運(yùn)行。

            • 雙擊 app 模塊中的 AndroidManifest.xml 。


            在 package=com.dji.ImportSDKDemo 后,<application 前插入如下內(nèi)容:

            <!-- Permissions and features -->
            <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" />
            <!-- Permissions and features -->
            • 在 application 元素的開(kāi)發(fā)添加 android:name=".MApplication" :
            <application
                android:name=".MApplication"
                android:allowBackup="true"
                android:icon="@mipmap/ic_launcher"
                android:label="@string/app_name"
                android:roundIcon="@mipmap/ic_launcher_round"
                android:supportsRtl="true"
                android:theme="@style/AppTheme" >
            • 在 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="Please enter your App Key here." />
            <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" >
            </service>
            <!-- DJI SDK -->
            • 如下所示,在activity元素中插入android:configChanges ="orientation"和android:screenOrientation ="portrait",以防止在屏幕方向變更時(shí)重啟activity,并將activity的屏幕方向設(shè)置為縱向模式 :
            <activity android:name=".MainActivity"
                      android:configChanges="orientation"
                      android:screenOrientation="portrait">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>

            生成App Key, 然后用App Key 字符串替換AndroidManifest.xml文件內(nèi)Please enter your App Key here. 字段。


            *博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。




            相關(guān)推薦

            技術(shù)專區(qū)

            關(guān)閉