大疆 DJI Mobile SDK 开发:模拟器调试
目錄
創(chuàng)建飛行控制器界面
1.新建Activiity
2.MainActivity
activity_main.xml
MainActivity.java
3.FlightActivity
activity_flight.xml
FlightActivity.java
4.AndroidManifest
DJI Mobile SDK的回調(diào)方法
?起飛、降落與返航的實(shí)現(xiàn)
獲取控制器
API Reference:FlightController()
起飛與取消起飛
API Reference:startTaskoff()、cancelTaskoff()
降落與取消降落
API Reference:startLanding()、cancelLanding()
返航與取消返航
API Reference: startGoHome()、cancelGoHome()
返航高度的設(shè)置與獲取
?API Reference: setGoHomeHeightInMeters()、getGoHomeHeightInMeters()
自定義提示
?
創(chuàng)建飛行控制器界面
1.新建Activiity
????????在 “com.dji.importSDKDemo” 包上單擊右鍵,新建一個(gè)名稱(chēng)為 FlightActivity、布局名為 activity_flight 的活動(dòng)。
2.MainActivity
activity_main.xml
????????在 MainActivity 布局文件 activity_main.xml 中添加一個(gè)名為 “飛行控制器” 的按鈕
<Buttonandroid:id="@+id/fight_controller"android:layout_width="match_parent"android:layout_height="wrap_content"app:layout_constraintTop_toTopOf="parent"app:layout_constraintBottom_toBottomOf="parent"android:layout_marginTop="15dp"android:text="飛行控制器"android:textSize="25sp"/>MainActivity.java
????????要在 MainActivity 中實(shí)現(xiàn)單擊 “飛行控制器” 按鈕跳轉(zhuǎn)到 FlightActivity 頁(yè)面的代碼,即在 MainActivity.java 文件中的 initUI() 函數(shù)的最后加入如下代碼
private void initUI() {…………Button fight_controller = (Button) findViewById(R.id.fight_controller);fight_controller.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {if (checkDroneConnection() == false) {return;}//彈出FlightActivityIntent i = new Intent(MainActivity.this, FlightActivity.class);startActivity(i);}});}? ? ? ? ?在單擊 “飛行控制器” 按鈕跳轉(zhuǎn)到 FlightActivity 頁(yè)面前,需要判斷應(yīng)用程序激活注冊(cè)、狀態(tài),以及無(wú)人機(jī)綁定、連接等是否正常。故在 initUI() 方法后添加 checkDroneConnection() 方法來(lái)判斷,代碼如下
private boolean checkDroneConnection() {//應(yīng)用程序激活管理器AppActivationManager mgrActivation = DJISDKManager.getInstance().getAppActivationManager();//判斷應(yīng)用程序是否注冊(cè)if (!DJISDKManager.getInstance().hasSDKRegistered()) {showToast("應(yīng)用程序未注冊(cè)");return false;}//判斷應(yīng)用程序是否激活if (mgrActivation.getAppActivationState() != AppActivationState.ACTIVATED) {showToast("應(yīng)用程序未激活");return false;}//判斷無(wú)人機(jī)是否綁定if (mgrActivation.getAircraftBindingState() != AircraftBindingState.BOUND) {showToast("無(wú)人機(jī)未綁定");return false;}//判斷無(wú)人機(jī)是否連接//if ((DJISDKManager.getInstance().getProduct() == null) || !(DJISDKManager.getInstance().getProduct().isConnected())) {BaseProduct product = DJISDKManager.getInstance().getProduct();if (product == null || !product.isConnected()) {showToast("無(wú)人機(jī)連接失敗");return false;}return true;}3.FlightActivity
activity_flight.xml
????????在 FlightActivity UI界面添加名為 “起飛”、“取消起飛”、“降落”、“取消降落”、“設(shè)置返航高度”、“獲取返航高度”、“返航”、“取消返航” 按鈕,界面與代碼如下:
FlightActivity UI界面 <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_margin="10dp" ><TextViewandroid:id="@+id/DJI_fly"style="?android:listSeparatorTextViewStyle"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="飛行控制"android:textSize="15sp"app:layout_constraintTop_toTopOf="parent"android:layout_marginTop="10dp" /><Buttonandroid:id="@+id/btn_takeoff"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="起飛"app:layout_constraintTop_toBottomOf="@+id/DJI_fly"android:layout_marginTop="10dp"android:textSize="25sp"android:padding="15dp" /><Buttonandroid:id="@+id/btn_takeoff_cancel"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="取消起飛"app:layout_constraintTop_toBottomOf="@+id/btn_takeoff"android:layout_marginTop="10dp"android:textSize="25sp"android:padding="15dp" /><Buttonandroid:id="@+id/btn_landing"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="降落"app:layout_constraintTop_toBottomOf="@+id/btn_takeoff_cancel"android:layout_marginTop="10dp"android:textSize="25sp"android:padding="15dp" /><Buttonandroid:id="@+id/btn_landing_cancel"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="取消降落"app:layout_constraintTop_toBottomOf="@+id/btn_landing"android:layout_marginTop="10dp"android:textSize="25sp"android:padding="15dp" /><Buttonandroid:id="@+id/btn_set_home_height"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="設(shè)置返航高度"app:layout_constraintTop_toBottomOf="@+id/btn_landing_cancel"android:layout_marginTop="10dp"android:textSize="25sp"android:padding="15dp" /><Buttonandroid:id="@+id/btn_get_home_height"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="獲取返航高度"app:layout_constraintTop_toBottomOf="@+id/btn_set_home_height"android:layout_marginTop="10dp"android:textSize="25sp"android:padding="15dp" /><Buttonandroid:id="@+id/btn_home"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="返航"app:layout_constraintTop_toBottomOf="@+id/btn_get_home_height"android:layout_marginTop="10dp"android:textSize="25sp"android:padding="15dp" /><Buttonandroid:id="@+id/btn_home_cancel"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="取消返航"app:layout_constraintTop_toBottomOf="@+id/btn_home"android:layout_marginTop="10dp"android:textSize="25sp"android:padding="15dp" /> </androidx.constraintlayout.widget.ConstraintLayout>FlightActivity.java
????????在上一步添加的按鈕,要使其實(shí)現(xiàn)功能,需要在 FlightActivity.java 中獲取上述8個(gè)按鈕的對(duì)象,并監(jiān)聽(tīng)其單擊方法,代碼如下:
public class FlightActivity extends AppCompatActivity implements View.OnClickListener {private Button mBtnTakeoff, mBtnCancelTakeoff, mBtnLanding, mBtnCancelLanding;private Button mBtnSetHomeHeight, mBtnGetHomeHeight, mBtnHome, mBtnCancelHome;public FlightActivity() {}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_flight);//初始化UI界面initUI();//初始化監(jiān)聽(tīng)器initListener();}private void initUI() {mBtnTakeoff = findViewById(R.id.btn_takeoff);mBtnCancelTakeoff = findViewById(R.id.btn_takeoff_cancel);mBtnLanding = findViewById(R.id.btn_landing);mBtnCancelLanding = findViewById(R.id.btn_landing_cancel);mBtnSetHomeHeight = findViewById(R.id.btn_set_home_height);mBtnGetHomeHeight = findViewById(R.id.btn_get_home_height);mBtnHome = findViewById(R.id.btn_home);mBtnCancelHome = findViewById(R.id.btn_home_cancel);}private void initListener() {mBtnTakeoff.setOnClickListener(this);mBtnCancelTakeoff.setOnClickListener(this);mBtnLanding.setOnClickListener(this);mBtnCancelLanding.setOnClickListener(this);mBtnSetHomeHeight.setOnClickListener(this);mBtnGetHomeHeight.setOnClickListener(this);mBtnHome.setOnClickListener(this);mBtnCancelHome.setOnClickListener(this);}@Overridepublic void onClick(View view) {switch (view.getId()) {case R.id.btn_takeoff: {takeoff();break;}case R.id.btn_takeoff_cancel: {cancelTakeoff();break;}case R.id.btn_landing: {landing();break;}case R.id.btn_landing_cancel: {cancelLanding();break;}case R.id.btn_set_home_height: {setHomeHeight();break;}case R.id.btn_get_home_height: {getHomeHeight();break;}case R.id.btn_home: {home();break;}case R.id.btn_home_cancel: {cancelHome();break;}default:break;}}//起飛private void takeoff() {}//取消起飛private void cancelTakeoff() {}//降落private void landing() {}//取消降落private void cancelLanding() {}//設(shè)置返航高度private void setHomeHeight() {}//獲取返航高度private void getHomeHeight() {}//返航private void home() {}//取消返航private void cancelHome() {}//在主線(xiàn)程中顯示提示private void showToast(final String toastMsg) {runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(getApplicationContext(), toastMsg, Toast.LENGTH_LONG).show();}});} }4.AndroidManifest
????????在 AndroidManifest.xml 文件中,配置 MainActivity 和 FlightActivity 之間的關(guān)系,以便于在?FlightActivity 中返回到?MainActivity,界面與代碼如下:
<activityandroid:name=".MainActivity"android:configChanges="orientation"android:launchMode="singleTop"android:screenOrientation="portrait"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter> </activity><activityandroid:name=".FlightActivity"android:configChanges="orientation"android:parentActivityName=".MainActivity"android:screenOrientation="portrait" />DJI Mobile SDK的回調(diào)方法
無(wú)人機(jī)的監(jiān)控操作需要通過(guò)LightBridge、OcuSync等鏈路進(jìn)行信息傳遞。
受信號(hào)衰減和環(huán)境干擾的影響,信息傳遞通常要消耗一定時(shí)間完成。因此對(duì)無(wú)人機(jī)的各類(lèi)操作均需要通過(guò)回調(diào)的方法來(lái)介入處理。
?在 Android Mobile SDK 中,回調(diào)函數(shù)的接口通過(guò) CommonCallbacks 定義。
- CompletionCallback :僅包括 onResult(DJIError? error) 抽象方法。當(dāng) error 為空時(shí),任務(wù)執(zhí)行成功;當(dāng) error 不為空時(shí),通過(guò)其 getDescription() 方法詳細(xì)錯(cuò)誤信息。
- CompletionCallbackWith<T>:包括 onSuccess(T? val) 和 onFailure(DJIError? error) 兩個(gè)方法。當(dāng)任務(wù)執(zhí)行成功時(shí),回調(diào) onSuccess(…) 方法,且返回參數(shù) val ;當(dāng)任務(wù)執(zhí)行失敗時(shí),回調(diào) onFailure(…) 方法,且其中的 error 對(duì)象包含了錯(cuò)誤描述。
- CompletionCallbackWithTwoParam<X, Y>:與?CompletionCallbackWith<T> 類(lèi)似,包括 onSuccess(X?val1, Y val2) 和 onFailure(DJIError? error) 兩個(gè)方法,方法執(zhí)行成功時(shí)返回 val1 和 val2 兩個(gè)參數(shù)。
?起飛、降落與返航的實(shí)現(xiàn)
獲取控制器
API Reference:FlightController()?
“點(diǎn)擊API可跳轉(zhuǎn)DJI Developer官網(wǎng)API相應(yīng)位置?”
創(chuàng)建獲取飛行控制器的 getFlightController() 方法
大疆Mobile SDK API中對(duì)FlightController() 類(lèi)的描述飛行控制器的功能由飛行控制器類(lèi)定義,飛行控制器對(duì)象可通過(guò)以下步驟獲取:
(1)通過(guò) DJISDKManager 獲取產(chǎn)品基類(lèi)(BaseProduct)對(duì)象,并判斷是否為無(wú)人機(jī)對(duì)象
(2)在 Android 中需要通過(guò)飛行控制器對(duì)象的 isConnected() 方法判斷是否與無(wú)人機(jī)成功連接
具體代碼實(shí)現(xiàn):
//獲取無(wú)人機(jī)的飛行控制器private FlightController getFlightController() {BaseProduct product = DJISDKManager.getInstance().getProduct();if (product != null && product.isConnected()) {if (product instanceof Aircraft) {return ((Aircraft) product).getFlightController();}}return null;}起飛與取消起飛
API Reference:startTaskoff()、cancelTaskoff()
“點(diǎn)擊API可跳轉(zhuǎn)DJI Developer官網(wǎng)API相應(yīng)位置?”
有關(guān) startTakeoff(…) 方法的描述 有關(guān) cancelTakeoff(…) 方法的描述題通過(guò)飛行控制器的自動(dòng)起飛和自動(dòng)精準(zhǔn)起飛方法可實(shí)現(xiàn)無(wú)人機(jī)的起飛動(dòng)作。
自動(dòng)起飛方法必須在電機(jī)關(guān)閉時(shí)調(diào)用,并在起飛后0.5m左右懸停并回調(diào)。對(duì)于具有下方視覺(jué)定位的無(wú)人機(jī),可通過(guò)自動(dòng)精準(zhǔn)起飛方法在起飛的6m之內(nèi)獲得其周?chē)曈X(jué)定位記憶,當(dāng)無(wú)人機(jī)再次降落時(shí)即可降落到相對(duì)更加準(zhǔn)確的位置。
具體代碼實(shí)現(xiàn):
? ? ? ? 實(shí)現(xiàn) takeoff() 和 cancelTakeoff() 方法,通過(guò)飛行控制器對(duì)象的 startTakeoff(…) 方法實(shí)現(xiàn)起飛功能,通過(guò)飛行控制器對(duì)象的?cancelTakeoff(…)?方法實(shí)現(xiàn)取消起飛功能
//起飛private void takeoff() {FlightController flightController = getFlightController();if (flightController != null) {flightController.startTakeoff(new CommonCallbacks.CompletionCallback() {@Overridepublic void onResult(DJIError djiError) {if (djiError != null) {showToast(djiError.toString());} else {showToast("開(kāi)始起飛!");}}});} else {showToast("飛行控制器獲取失敗,請(qǐng)檢查飛行控制器是否連接正常!");}}//取消起飛private void cancelTakeoff() {FlightController flightController = getFlightController();if (flightController != null) {flightController.cancelTakeoff(new CommonCallbacks.CompletionCallback() {@Overridepublic void onResult(DJIError djiError) {if (djiError != null) {showToast(djiError.toString());} else {showToast("取消起飛成功!");}}});} else {showToast("飛行控制器獲取失敗,請(qǐng)檢查飛行控制器是否連接正常!");}}降落與取消降落
API Reference:startLanding()、cancelLanding()
“點(diǎn)擊API可跳轉(zhuǎn)DJI Developer官網(wǎng)API相應(yīng)位置?”
有關(guān) startLanding(…) 方法的描述 有關(guān) cancelLanding(…) 方法的描述通過(guò)飛行控制器的自動(dòng)降落方法可實(shí)現(xiàn)無(wú)人機(jī)的降落動(dòng)作。
對(duì)于具有降落保護(hù)功能(下方避障功能)的無(wú)人機(jī),無(wú)人機(jī)在距離地面 0.3m 時(shí)會(huì)對(duì)地面進(jìn)行檢測(cè)。如果檢測(cè)通過(guò),則自動(dòng)進(jìn)行降落;如果檢測(cè)不通過(guò),則需要通過(guò)確認(rèn)自動(dòng)降落的方法繼續(xù)執(zhí)行降落程序。
????????實(shí)現(xiàn) landing() 和 cancelLanding() 方法,通過(guò)飛行控制器對(duì)象的 startLanding(…) 方法實(shí)現(xiàn)降落功能,通過(guò)飛行控制器的 cancelLanding(…) 方法實(shí)現(xiàn)取消降落功能。
具體代碼實(shí)現(xiàn):?
//降落private void landing() {FlightController flightController = getFlightController();if (flightController != null) {flightController.startLanding(new CommonCallbacks.CompletionCallback() {@Overridepublic void onResult(DJIError djiError) {if (djiError != null) {showToast("開(kāi)始降落!");} else {showToast(djiError.toString());}}});} else {showToast("飛行控制器獲取失敗,請(qǐng)檢查飛行控制器是否連接正常!");}}//取消降落private void cancelLanding() {FlightController flightController = getFlightController();if (flightController != null) {flightController.cancelLanding(new CommonCallbacks.CompletionCallback() {@Overridepublic void onResult(DJIError djiError) {if (djiError != null) {showToast("取消降落成功!");} else {showToast(djiError.toString());}}});} else {showToast("飛行控制器獲取失敗,請(qǐng)檢查飛行控制器是否連接正常!");}}????????在 Android 中,是否需要確認(rèn)降落需要通過(guò)飛行控制器狀態(tài)(FlightControllerState)的isLandingConfirmationNeeded() 方法獲取。如需要確認(rèn)降落,則可通過(guò)飛行控制器類(lèi)的confirmLanding(…)?方法繼續(xù)降落。
返航與取消返航
API Reference: startGoHome()、cancelGoHome()
“點(diǎn)擊API可跳轉(zhuǎn)DJI Developer官網(wǎng)API相應(yīng)位置?”
有關(guān) startGoHome(…) 方法的描述 有關(guān) cancelGoHome(…) 方法的描述????????實(shí)現(xiàn) home() 和 cancelhome() 方法,通過(guò)飛行控制器對(duì)象的 startGoHome(…) 方法實(shí)現(xiàn)返航功能,通過(guò)飛行控制器的 cancelGoHome(…) 方法實(shí)現(xiàn)取消返航功能。?
具體代碼實(shí)現(xiàn):
//返航private void home() {FlightController flightController = getFlightController();if (flightController != null) {flightController.startGoHome(new CommonCallbacks.CompletionCallback() {@Overridepublic void onResult(DJIError djiError) {if (djiError != null) {showToast("開(kāi)始返航!");} else {showToast(djiError.toString());}}});} else {showToast("飛行控制器獲取失敗,請(qǐng)檢查飛行控制器是否連接正常!");}}//取消返航private void cancelHome() {FlightController flightController = getFlightController();if (flightController != null) {flightController.cancelGoHome(new CommonCallbacks.CompletionCallback() {@Overridepublic void onResult(DJIError djiError) {if (djiError != null) {showToast("取消返航成功!");} else {showToast(djiError.toString());}}});} else {showToast("飛行控制器獲取失敗,請(qǐng)檢查飛行控制器是否連接正常!");}}返航高度的設(shè)置與獲取
?API Reference: ?setGoHomeHeightInMeters()、getGoHomeHeightInMeters()
?“點(diǎn)擊API可跳轉(zhuǎn)DJI Developer官網(wǎng)API相應(yīng)位置?”
有關(guān) setGoHomeHeightInMeters(…) 方法的描述返航高度應(yīng)設(shè)置在20~500m 的范圍內(nèi),切不超過(guò)得醒的最大高度。
當(dāng)返航高度設(shè)置過(guò)低時(shí),會(huì)返回類(lèi) “The go home altitude is too low (lower than 20m)” 的錯(cuò)誤提示;當(dāng)設(shè)置的返航高度過(guò)高時(shí),會(huì)返回類(lèi)似 “The go home altitude is too high (higher than max flight height)” 的錯(cuò)誤提示。
有關(guān) getGoHomeHeightInMeters(…) 方法的描述????????實(shí)現(xiàn) setGoHomeHeight() 和 getGoHomeHeight() 方法,通過(guò)飛行控制器對(duì)象的 setGoHomeHeightInMeters(…) 方法實(shí)現(xiàn)設(shè)置返航高度功能,通過(guò)飛行控制器的 getGoHomeHeightInMeters(…) 方法實(shí)現(xiàn)獲取返航高度功能。?
具體代碼實(shí)現(xiàn):
//設(shè)置返航高度private void setHomeHeight() {//設(shè)置返航高度文本里final EditText editText = new EditText(this);//限定只能輸入數(shù)字editText.setInputType(InputType.TYPE_CLASS_NUMBER);new AlertDialog.Builder(this).setTitle("請(qǐng)輸入返航高度(m)").setView(editText).setPositiveButton("確定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {int height = Integer.parseInt(editText.getText().toString());final FlightController flightController = getFlightController();if (flightController != null) {flightController.setGoHomeHeightInMeters(height, new CommonCallbacks.CompletionCallback() {@Overridepublic void onResult(DJIError djiError) {if (djiError != null) {showToast(djiError.toString());} else {showToast("返航高度設(shè)置成功!");}}});} else {showToast("飛行控制器獲取失敗,請(qǐng)檢查飛行控制器是否連接正常!");}}}).setNegativeButton("取消", null).show();}//獲取返航高度private void getHomeHeight() {final FlightController flightController = getFlightController();if (flightController != null) {flightController.getGoHomeHeightInMeters(new CommonCallbacks.CompletionCallbackWith<Integer>() {@Overridepublic void onSuccess(Integer integer) {showToast("返航高度為:" + integer + "米");}@Overridepublic void onFailure(DJIError djiError) {showToast("獲取返航高度失敗:" + djiError.toString());}});} else {showToast("飛行控制器獲取失敗,請(qǐng)檢查飛行控制器是否連接正常!");}}????????在?setGoHomeHeight() 方法中,通過(guò) AlertDialog 類(lèi)彈出對(duì)話(huà)框,用于用戶(hù)輸入返航高度,由于 setView(editText) 語(yǔ)句,將輸入內(nèi)容限定為整形數(shù)字。
設(shè)置返航高度對(duì)話(huà)框?????????在關(guān)閉對(duì)話(huà)框后,調(diào)用飛行控制器的 setGoHomeHeightInMeters(…) 方法,并傳入返航高度和回調(diào)函數(shù)。在 getGoHomeHeight() 方法中,其回調(diào)方法 onSuccess(Integer?height) 中的 height 參數(shù)返回了無(wú)人機(jī)的返航高度。
自定義提示
????????代碼中均使用 showToast() 方法來(lái)實(shí)現(xiàn)在主線(xiàn)程中顯示提示的功能,也可直接使用 Toast()?提示,將文中代碼涉及 showToast() 的部分更換為 Toast()?
//在主線(xiàn)程中顯示提示private void showToast(final String toastMsg) {runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(getApplicationContext(), toastMsg, Toast.LENGTH_LONG).show();}});}按住鍵盤(pán)的 Crtl 鍵,鼠標(biāo)左鍵單擊Toast方法,即可在 Android Studio 中跳轉(zhuǎn)到 Toast 類(lèi)?
public class Toast {public static final int LENGTH_LONG = 1;public static final int LENGTH_SHORT = 0;public Toast(Context context) {throw new RuntimeException("Stub!");}public void show() {throw new RuntimeException("Stub!");}public void cancel() {throw new RuntimeException("Stub!");}/** @deprecated */@Deprecatedpublic void setView(View view) {throw new RuntimeException("Stub!");}/** @deprecated */@Deprecated@Nullablepublic View getView() {throw new RuntimeException("Stub!");}public void setDuration(int duration) {throw new RuntimeException("Stub!");}public int getDuration() {throw new RuntimeException("Stub!");}public void setMargin(float horizontalMargin, float verticalMargin) {throw new RuntimeException("Stub!");}public float getHorizontalMargin() {throw new RuntimeException("Stub!");}public float getVerticalMargin() {throw new RuntimeException("Stub!");}public void setGravity(int gravity, int xOffset, int yOffset) {throw new RuntimeException("Stub!");}public int getGravity() {throw new RuntimeException("Stub!");}public int getXOffset() {throw new RuntimeException("Stub!");}public int getYOffset() {throw new RuntimeException("Stub!");}public void addCallback(@NonNull Toast.Callback callback) {throw new RuntimeException("Stub!");}public void removeCallback(@NonNull Toast.Callback callback) {throw new RuntimeException("Stub!");}public static Toast makeText(Context context, CharSequence text, int duration) {throw new RuntimeException("Stub!");}public static Toast makeText(Context context, int resId, int duration) throws NotFoundException {throw new RuntimeException("Stub!");}public void setText(int resId) {throw new RuntimeException("Stub!");}public void setText(CharSequence s) {throw new RuntimeException("Stub!");}public abstract static class Callback {public Callback() {throw new RuntimeException("Stub!");}public void onToastShown() {throw new RuntimeException("Stub!");}public void onToastHidden() {throw new RuntimeException("Stub!");}} }總結(jié)
以上是生活随笔為你收集整理的大疆 DJI Mobile SDK 开发:模拟器调试的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 个性化电脑3D桌面软件选择方案
- 下一篇: 【cut命令】