基于javadrone api实现ARDrone Android控制

需要的资料
javadrone api:  http://code.google.com/p/javadrone
使用 javadrone api的一个 Android demo( ARDrone-on-Android-master ):  https://github.com/UnknownGuardian/ARDrone-on-Android

修改demo
          Demo使用了 javadrone api中的ardrone、ardrone/comands、ardrone/video以及 ardrone/util的一部分api, 并使用了 http://code.google.com/p/javadrone 中javadrone-93e27c36a077.zip的中的3个.jar包( 具体哪3个包见 demo的.classpath文件 )。我的目的是修改该demo从而做到Android对ARDrone的基本控制。
          Demo中,其实不需要使用 javadrone-93e27c36a077.zip的中的3个.jar包也能顺利build通过,所以直接在 demo 的.classpath文件中删除这3个包的路径, 这样demo和 javadrone-93e27c36a077.zip就没有依赖关系了;其次, ardrone/util中BufferedImageVideoListener.java 引用了Android SDK的一个早期的包 java.awt.image.BufferedImage,所以该文件始终编译不过,由于目标app暂时不需要处理ardrone的video,所直接把 ardrone/util从demo从工程中删除。做完这些修改后build通过,手机上测试该demo,发现按下 连接ARDrone的按钮AnDrone有相应的反应(LED如代码中的闪烁),连接上后电池状态能获取到(说明Navadata读取正常),但 视频显示是没有的,起飞按钮也很少有效果(好像有效过1次)。
         Demo中考虑了视频接收,并增加了一些进度条、图像等控件,这在我的目标里是不需要的,而这些代码可能会影响到控制命令的发送,所以我将demo作一些修改以去掉这些内容。首先修改app界面main.xml,
<?xml version= "1.0" encoding= "utf-8"?>
<LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android"
    android:layout_width= "match_parent"
    android:layout_height= "match_parent"
    android:orientation= "vertical" >
    <TextView
        android:layout_width= "match_parent"
        android:layout_height= "wrap_content"
        android: text= "@string/hello"
        android: id= "@+id/statusBar"
        android:gravity= "center_horizontal"
        android: background= "#B1DCFE"
        android:textColor= "#000000">
    </TextView>
    < Button
        android: id= "@+id/connectButton"
        android: text= "Connect..."
        android:layout_width= "match_parent"
        android:layout_height= "wrap_content"></ Button>
    < Button
        android: id= "@+id/launchButton"
        android: text= "Take off"
        android:layout_width= "match_parent"
        android:layout_height= "wrap_content"></ Button>
    < Button
        android: id= "@+id/hoverButton"
        android: text= "Hover"
        android:layout_width= "match_parent"
        android:layout_height= "wrap_content"></ Button>
    
    <LinearLayout
        android:layout_width= "match_parent"
        android:layout_height= "wrap_content"
        android:orientation= "horizontal" >
        < Button
            android: id= "@+id/frontButton"
            android: text= "Front"
            android:layout_width= "match_parent"
            android:layout_height= "wrap_content"
            android:layout_weight= "1"></ Button>
        < Button
            android: id= "@+id/backButton"
            android: text= "Back"
            android:layout_width= "match_parent"
            android:layout_height= "wrap_content"
            android:layout_weight= "1"></ Button>
    </LinearLayout>
    
    <LinearLayout
        android:layout_width= "match_parent"
        android:layout_height= "wrap_content"
        android:orientation= "horizontal" >
        < Button
            android: id= "@+id/leftButton"
            android: text= "Left"
            android:layout_width= "match_parent"
            android:layout_height= "wrap_content"
            android:layout_weight= "1"></ Button>
        < Button
            android: id= "@+id/rightButton"
            android: text= "Right"
            android:layout_width= "match_parent"
            android:layout_height= "wrap_content"
            android:layout_weight= "1"></ Button>
    </LinearLayout>
    
    <LinearLayout
        android:layout_width= "match_parent"
        android:layout_height= "wrap_content"
        android:orientation= "horizontal" >
        < Button
            android: id= "@+id/upButton"
            android: text= "Up"
            android:layout_width= "match_parent"
            android:layout_height= "wrap_content"
            android:layout_weight= "1"></ Button>
        < Button
            android: id= "@+id/downButton"
            android: text= "Down"
            android:layout_width= "match_parent"
            android:layout_height= "wrap_content"
            android:layout_weight= "1"></ Button>
    </LinearLayout>
        
    <LinearLayout
        android:layout_width= "match_parent"
        android:layout_height= "wrap_content"
        android:orientation= "horizontal" >
        < Button
            android: id= "@+id/spin_leftButton"
            android: text= "Spin Left"
            android:layout_width= "match_parent"
            android:layout_height= "wrap_content"
            android:layout_weight= "1"></ Button>
        < Button
            android: id= "@+id/spin_rightButton"
            android: text= "Spin Right"
            android:layout_width= "match_parent"
            android:layout_height= "wrap_content"
            android:layout_weight= "1"></ Button>
    </LinearLayout>
    
    <TextView
        android: id= "@+id/batteryStatusText"
        android:gravity= "center_horizontal"
        android: text= "Battery Status"
        android:textAppearance= "?android:attr/textAppearanceSmall"
        android:layout_width= "match_parent"
        android:layout_height= "wrap_content"></TextView>
</LinearLayout>
修改后的界面比较简洁,除了一系列按钮就是2个文本框。接下来修改AndroidManifest.xml,
<?xml version= "1.0" encoding= "utf-8"?>
< !-- package= "com.codeminders.ardrone.examples" android:versionCode= "1" -->
<manifest xmlns:android= "http://schemas.android.com/apk/res/android"
    package= "com.profusiongames" android:versionCode= "1"
    android:versionName= "1.0">
    <uses-sdk android:minSdkVersion= "8"/>
    <application android: icon= "@drawable/icon" android: label= "@string/app_name">
        <activity android:name= ".FusionDrone"
            android: label= "@string/app_name"
            android:configChanges= "orientation|keyboard"
            android:screenOrientation= "portrait"
            android: theme= "@android:style/Theme.Light.NoTitleBar.Fullscreen">
            
            <intent-filter>
                <action android:name= "android.intent.action.MAIN" />
                <category android:name= "android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <uses-permission android:name= "android.permission.INTERNET" />
    <uses-permission android:name= "android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name= "android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name= "android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
    <uses-permission android:name= "android.permission.ACCESS_MOCK_LOCATION" />
    <uses-permission android:name= "android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name= "android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name= "android.permission.AUTHENTICATE_ACCOUNTS" />
    <uses-permission android:name= "android.permission.BATTERY_STATS" />
    <uses-permission android:name= "android.permission.BLUETOOTH" />
    <uses-permission android:name= "android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name= "android.permission.BROADCAST_STICKY" />
    <uses-permission android:name= "android.permission.CALL_PHONE" />
    <uses-permission android:name= "android.permission.CAMERA" />
    <uses-permission android:name= "android.permission.CHANGE_CONFIGURATION" />
    <uses-permission android:name= "android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name= "android.permission.CHANGE_WIFI_MULTICAST_STATE" />
    <uses-permission android:name= "android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name= "android.permission.CLEAR_APP_CACHE" />
    <uses-permission android:name= "android.permission.DISABLE_KEYGUARD" />
    <uses-permission android:name= "android.permission.DUMP" />
    <uses-permission android:name= "android.permission.EXPAND_STATUS_BAR" />
    <uses-permission android:name= "android.permission.FLASHLIGHT" />
    <uses-permission android:name= "android.permission.GET_ACCOUNTS" />
    <uses-permission android:name= "android.permission.GET_PACKAGE_SIZE" />
    <uses-permission android:name= "android.permission.GET_TASKS" />
    <uses-permission android:name= "android.permission.INTERNET" />
    <uses-permission android:name= "android.permission.MANAGE_ACCOUNTS" />
    <uses-permission android:name= "android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name= "android.permission.MODIFY_PHONE_STATE" />
    <uses-permission android:name= "android.permission.MOUNT_FORMAT_FILESYSTEMS" />
    <uses-permission android:name= "android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <uses-permission android:name= "android.permission.PERSISTENT_ACTIVITY" />
    <uses-permission android:name= "android.permission.PROCESS_OUTGOING_CALLS" />
    <uses-permission android:name= "android.permission.READ_CALENDAR" />
    <uses-permission android:name= "android.permission.READ_CONTACTS" />
    <uses-permission android:name= "android.permission.READ_LOGS" />
    <uses-permission android:name= "android.permission.READ_PHONE_STATE" />
    <uses-permission android:name= "android.permission.READ_SMS" />
    <uses-permission android:name= "android.permission.READ_SYNC_SETTINGS" />
    <uses-permission android:name= "android.permission.READ_SYNC_STATS" />
    <uses-permission android:name= "android.permission.RECEIVE_MMS" />
    <uses-permission android:name= "android.permission.RECEIVE_SMS" />
    <uses-permission android:name= "android.permission.RECEIVE_WAP_PUSH" />
    <uses-permission android:name= "android.permission.RECORD_AUDIO" />
    <uses-permission android:name= "android.permission.REORDER_TASKS" />
    <uses-permission android:name= "android.permission.SEND_SMS" />
    <uses-permission android:name= "android.permission.SET_ALWAYS_FINISH" />
    <uses-permission android:name= "android.permission.SET_ANIMATION_SCALE" />
    <uses-permission android:name= "android.permission.SET_DEBUG_APP" />
    <uses-permission android:name= "android.permission.SET_PROCESS_LIMIT" />
    <uses-permission android:name= "android.permission.SET_TIME_ZONE" />
    <uses-permission android:name= "android.permission.SET_WALLPAPER" />
    <uses-permission android:name= "android.permission.SET_WALLPAPER_HINTS" />
    <uses-permission android:name= "android.permission.SIGNAL_PERSISTENT_PROCESSES" />
    <uses-permission android:name= "android.permission.SUBSCRIBED_FEEDS_READ" />
    <uses-permission android:name= "android.permission.SUBSCRIBED_FEEDS_WRITE" />
    <uses-permission android:name= "android.permission.USE_CREDENTIALS" />
    <uses-permission android:name= "android.permission.VIBRATE" />
    <uses-permission android:name= "android.permission.WAKE_LOCK" />
    <uses-permission android:name= "android.permission.WRITE_APN_SETTINGS" />
    <uses-permission android:name= "android.permission.WRITE_CALENDAR" />
    <uses-permission android:name= "android.permission.WRITE_CONTACTS" />
    <uses-permission android:name= "android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name= "android.permission.WRITE_SETTINGS" />
    <uses-permission android:name= "android.permission.WRITE_SMS" />
    <uses-permission android:name= "android.permission.WRITE_SYNC_SETTINGS" />
</manifest>  
主要修改了 android:screenOrientation 项(landscape->portrait),使app界面从横屏变为竖屏。最后,修改的是响应控件的java代码FusionDrone.java,
package com.profusiongames ;
import java.io.IOException ;
import android.app.Activity ;
import android.hardware.Sensor ;
import android.hardware.SensorEvent ;
import android.hardware.SensorEventListener ;
import android.hardware.SensorManager ;
import android.os.AsyncTask ;
import android.os.Bundle ;
import android.util. Log ;
import android.view.View ;
import android.view.Window ;
import android.widget. Button ;
//import android.widget.ProgressBar ;
import android.widget.TextView ;
import com.codeminders.ardrone.ARDrone ;
import com.codeminders.ardrone.NavData ;
import com.codeminders.ardrone.NavDataListener ;
public class FusionDrone extends Activity implements NavDataListener,SensorEventListener {
    private  static FusionDrone fDrone ;
    private  static ARDrone drone ;
    private  static SensorManager sensorManager ;
    private  static boolean isConnected =  false ;
    private  static boolean isFlying =  false ;
    private int batteryLife =  0 ;
    public  static int queueToShow =  0 ;
     /* Components */
    @SuppressWarnings( "unused")
    private TextView  statusBar ;
    private  Button connectionButton ;
    private  Button launchButton ;
    private  Button hoverButton ;
    private  Button frontButton ;
    private  Button backButton ;
    private  Button leftButton ;
    private  Button rightButton ;
    private  Button upButton ;
    private  Button downButton ;
    private  Button spin_leftButton ;
    private  Button spin_rightButton ;
    private TextView batteryText ;
     /* Components */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState) ;
        requestWindowFeature(Window.FEATURE_NO_TITLE) ;
        setContentView(R.layout.main) ;
        fDrone = this ;
        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE) ;
        getUIComponents() ;
    }
    
    @Override
    protected void onResume() {
        super.onResume() ;
        sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),  3) ;
    }
    
    @Override
    protected void onPause() {
        super.onPause() ;
        sensorManager.unregisterListener(this) ;
    }
    
    @Override
    protected void onStop() {
        super.onStop() ;
        sensorManager.unregisterListener(this) ;
        try {
             if(drone  != null)
            {
                drone.clearImageListeners() ;
                drone.clearNavDataListeners() ;
                drone.clearStatusChangeListeners() ;
                drone.clearStatusChangeListeners() ;
                drone.disconnect() ;
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace() ;
        }   
    }
    
    private void getUIComponents() {
         statusBar = (TextView) findViewById(R. id. statusBar) ;
        connectionButton = ( Button) findViewById(R. id.connectButton) ;
        connectionButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                 Log.v( "DRONE""Clicked Connection button") ;
                 if ( !isConnected) {
                    connectionButton.setEnabled( false) ;
                    connectionButton.setText( "Connecting...") ;
                    (new DroneStarter()).execute(FusionDrone.drone) ;
                }  else {
                     if(isFlying) { try { drone.land(); Thread.sleep(400);} 
                         catch (Exception e) {e.printStackTrace();}
                         //if going to disconnect, but still flying, attempt to tell drone to land
                    connectionButton.setEnabled( false) ;
                    connectionButton.setText( "Disconnecting...") ;
                    (new DroneEnder()).execute(FusionDrone.drone) ;
                }
            }
        }) ;
        
        launchButton = ( Button)findViewById(R. id.launchButton) ;
        launchButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                 Log.v( "DRONE""Clicked Launch button") ;
                 if ( !isConnected) {
                    //do nothing
                }  else  if(isFlying) {
                    try { drone.land(); launchButton.setText("Takeoff"); isFlying = false;} 
                    catch (IOException e) {e.printStackTrace();}
                }  else    {
                    try { drone.takeOff(); launchButton.setText("Land"); isFlying = true;}
                    catch (IOException e) {e.printStackTrace() ;}
                }
            }
        }) ;
        
        hoverButton = ( Button)findViewById(R. id.hoverButton) ;
        hoverButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                 Log.v( "DRONE""Clicked Hover button") ;
                 if ( !isConnected) {
                    //do nothing
                }  else  if(isFlying) {
                    try { drone.hover() ;} 
                    catch (IOException e) {e.printStackTrace() ;}
                } 
            }
        }) ;
        
        frontButton = ( Button)findViewById(R. id.frontButton) ;
        frontButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                 Log.v( "DRONE""Clicked Front button") ;
                 if ( !isConnected) {
                    //do nothing
                }  else  if(isFlying) {
                    try { drone. move(( float) 0. 0,( float)- 0. 05,( float) 0. 0,( float) 0. 0) ;} 
                    catch (IOException e) {e.printStackTrace() ;}
                } 
            }
        }) ;
        
        backButton = ( Button)findViewById(R. id.backButton) ;
        backButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                 Log.v( "DRONE""Clicked Back button") ;
                 if ( !isConnected) {
                    //do nothing
                }  else  if(isFlying) {
                    try { drone. move(( float) 0. 0,( float) 0. 05,( float) 0. 0,( float) 0. 0) ;} 
                    catch (IOException e) {e.printStackTrace() ;}
                } 
            }
        }) ;
        
        leftButton = ( Button)findViewById(R. id.leftButton) ;
        leftButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                 Log.v( "DRONE""Clicked Left button") ;
                 if ( !isConnected) {
                    //do nothing
                }  else  if(isFlying) {
                    try { drone. move(( float)- 0. 05,( float) 0. 0,( float) 0. 0,( float) 0. 0) ;} 
                    catch (IOException e) {e.printStackTrace() ;}
                } 
            }
        }) ;
        
        rightButton = ( Button)findViewById(R. id.rightButton) ;
        rightButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                 Log.v( "DRONE""Clicked Right button") ;
                 if ( !isConnected) {
                    //do nothing
                }  else  if(isFlying) {
                    try { drone. move(( float) 0. 05,( float) 0. 0,( float) 0. 0,( float) 0. 0) ;} 
                    catch (IOException e) {e.printStackTrace() ;}
                } 
            }
        }) ;
        
        upButton = ( Button)findViewById(R. id.upButton) ;
        upButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                 Log.v( "DRONE""Clicked Up button") ;
                 if ( !isConnected) {
                    //do nothing
                }  else  if(isFlying) {
                    try { drone. move(( float) 0. 0,( float) 0. 0,( float) 0. 05,( float) 0. 0) ;} 
                    catch (IOException e) {e.printStackTrace() ;}
                } 
            }
        }) ;
        
        downButton = ( Button)findViewById(R. id.downButton) ;
        downButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                 Log.v( "DRONE""Clicked Down button") ;
                 if ( !isConnected) {
                    //do nothing
                }  else  if(isFlying) {
                    try { drone. move(( float) 0. 0,( float) 0. 0,( float)- 0. 05,( float) 0. 0) ;} 
                    catch (IOException e) {e.printStackTrace() ;}
                } 
            }
        }) ;
        
        spin_leftButton = ( Button)findViewById(R. id.spin_leftButton) ;
        spin_leftButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                 Log.v( "DRONE""Clicked Spin Left button") ;
                 if ( !isConnected) {
                    //do nothing
                }  else  if(isFlying) {
                    try { drone. move(( float) 0. 0,( float) 0. 0,( float) 0. 0,( float)- 0. 05) ;} 
                    catch (IOException e) {e.printStackTrace() ;}
                } 
            }
        }) ;
        
        spin_rightButton = ( Button)findViewById(R. id.spin_rightButton) ;
        spin_rightButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                 Log.v( "DRONE""Clicked Spin Right button") ;
                 if ( !isConnected) {
                    //do nothing
                }  else  if(isFlying) {
                    try { drone. move(( float) 0. 0,( float) 0. 0,( float) 0. 0,( float) 0. 05) ;} 
                    catch (IOException e) {e.printStackTrace() ;}
                } 
            }
        }) ;
        
        batteryText = (TextView) findViewById(R. id.batteryStatusText) ;
    }
     /*public static ARDrone getARDrone() {
        return drone;
    }
    public static FusionDrone getFusionDrone() {
        return fDrone;
    }*/

    
    @Override
    public void navDataReceived(NavData nd) {
        //NavData.printState(nd) ;
        // Log.v( "DRONE", nd.getVisionTags().toString()) ;
         if(nd.getVisionTags()  != null)
        {
             Log.v( "DRONE", nd.getVisionTags().toString()) ;
        }
        batteryLife = nd.getBattery() ;
        runOnUiThread(new Runnable() {
            public void  run() {
                batteryText.setText( "Battery Life: "  + batteryLife  +  "%") ;
            }
        }) ;
    }
    
     /********************* The following is a must***********************/
    private  float sensorThreshold =  3 ;
    private double startX = - 1f ;
    private double startY = - 1f ;
    private double startZ = - 1f ;
    @Override
    public void onSensorChanged(SensorEvent e) {
         if(Math. random() <  1return ;
         Log.v( "DRONE""sensor: "  + e.sensor  +  ", x: "  + MathUtil.trunk(e.values[ 0])  +  ", y: "  + MathUtil.trunk(e.values[ 1])  +  ", z: "  + MathUtil.trunk(e.values[ 2])) ;
         if(startX == - 1f
        {
            startX = e.values[ 0] ;
            startY = e.values[ 1] ;
            startZ = e.values[ 2] ;
        }
         float shortX = MathUtil.trunk(MathUtil.getShortestAngle(e.values[ 0],( float) startX)) ;
         float shortY = MathUtil.trunk(MathUtil.getShortestAngle(e.values[ 1],( float) startY)) ;
         float shortZ = MathUtil.trunk(MathUtil.getShortestAngle(e.values[ 2],( float) startZ)) ;
         if( MathUtil. abs(shortX) <  sensorThreshold) shortX =  0 ;// do nothing
         if( MathUtil. abs(shortY) <  sensorThreshold) shortY =  0 ;// do nothing
         if( MathUtil. abs(shortZ) <  sensorThreshold) shortZ =  0 ;// do nothing
         Log.v( "DRONE""sensor difference: x: "  + shortX  +  ", y: "  + shortY  +  ", z: "  + shortZ) ;
    } 
    
    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
        // TODO Auto-generated method stub
        // Log.v( "DRONE""Accuracy changed: "  + accuracy) ;
        
    }
     /*********************************************************************/
    
    private class DroneStarter extends AsyncTask<ARDrone,  Integer, Boolean> {
        private  static final int CONNECTION_TIMEOUT =  3000 ;
        @Override
        protected Boolean doInBackground(ARDrone... drones) {
            ARDrone drone = drones[ 0] ;
            try {
                drone = new ARDrone() ;
                FusionDrone.drone = drone ; // passing in null objects will not pass object refs
                drone.connect() ;
                drone.clearEmergencySignal() ;
                drone.waitForReady(CONNECTION_TIMEOUT) ;
                drone.playLED( 1104) ;
                drone.addNavDataListener(FusionDrone.fDrone) ;
                //drone.selectVideoChannel(ARDrone.VideoChannel.HORIZONTAL_ONLY) ;
                //try {
                    //drone.sendTagDetectionOnData() ;
                    //drone.sendVideoOnData() ;
                    //drone.enableAutomaticVideoBitrate() ;
                //}
                //catch(Exception e) { e.printStackTrace() ;}
                 Log.v( "DRONE""Connected to ARDrone"  + FusionDrone.drone) ;
                 return  true ;
            } catch (Exception e) {
                e.printStackTrace() ;
                try {
                    drone.clearEmergencySignal() ;
                    //drone.clearImageListeners() ;
                    drone.clearNavDataListeners() ;
                    drone.clearStatusChangeListeners() ;
                    drone.disconnect() ;
                } catch (Exception e1) {
                    e1.printStackTrace() ;
                }
                 Log.v( "DRONE""Caught exception. Connection time out."  + FusionDrone.drone) ;
            }
             return  false ;
        }
        protected void onPostExecute(Boolean success) {
             if (success.booleanValue()) {
                connectionButton.setText( "Disconnect...") ;
            }  else {
                connectionButton.setText( "Error 1. Retry?") ;
            }
            isConnected = success.booleanValue() ;
            connectionButton.setEnabled( true) ;
            //connectionWhirlProgress.setVisibility( Button.INVISIBLE) ;
        }
    }
    
    
    private class DroneEnder extends AsyncTask<ARDrone,  Integer, Boolean> {
        @Override
        protected Boolean doInBackground(ARDrone... drones) {
            ARDrone drone = drones[ 0] ;
            try {
                drone.playLED( 2104) ;
                drone.clearEmergencySignal() ;
                //drone.clearImageListeners() ;
                drone.clearNavDataListeners() ;
                drone.clearStatusChangeListeners() ;
                drone.disconnect() ;
                 Log.v( "DRONE""Disconnected to ARDrone"  + FusionDrone.drone) ;
                 return  true ;
            } catch (Exception e) {
                e.printStackTrace() ;
                try {
                    drone.clearEmergencySignal() ;
                    //drone.clearImageListeners() ;
                    drone.clearNavDataListeners() ;
                    drone.clearStatusChangeListeners() ;
                    drone.disconnect() ;
                } catch (Exception e1) {
                    e1.printStackTrace() ;
                }
                 Log.v( "DRONE""Caught exception. Disconnection error.") ;
            }
             return  false ;
        }
        protected void onPostExecute(Boolean success) {
             if (success.booleanValue()) {
                connectionButton.setText( "Connect...") ;
                connectionButton.setEnabled( true) ;
                batteryText.setText( "Battery Status") ;
            }  else {
                connectionButton.setText( "Error 2. Retry?") ;
            }
            isConnected =  !success.booleanValue() ;
        }
    }
    
}
代码中,按键响应和Navadata接受保留下来并做扩充,视频和其他控件的内容一律删除掉。
          这下,整个代码就整洁很多了,build通过后,在真机上测试,效果比原来demo好多了(demo只有连接ardrone按键比较灵敏,其他都基本没效果;现在按键基本都有相应的效果了)。

参考:
http://code.google.com/p/javadrone/source/browse/src/com/codeminders/ardrone/examples/RotationSnapshotTaker.java?r=faeae1f020fa6399b5261e8d3fd6e1a44be9f834(一个javadrone控制api的使用例子)



你可能感兴趣的:(android,ArDrone)