开源个安卓程序:蓝牙遥控智能车程序-单片机控制安卓上位机

    大二寒假学做蓝牙遥控智能车,也就学了安卓编程,写了这个安卓遥控程序。这是第一版本,用按钮实现控制的,等我把重力感应控制的那个程序做稳定了再开源。
    上个图:
            开源个安卓程序:蓝牙遥控智能车程序-单片机控制安卓上位机_第1张图片


    主要参考安卓SDK自带的开源例程,所以觉得还是有必要开源代码的,不想自己建工程可以直接下载apk包:
    ishare.iask.sina.com.cn/f/37552296.html
http://download.csdn.net/detail/canyue102/5749027
博主最近在电脑上自建了博客,以后也用那个了,欢迎关注访问,里面也有很多有用资源:

http://www.embbnux.com


开发环境: ubuntu+eclipse+adt+java
主要程序:
JAVA程序:
 
  一、BluetoothChat.java

 

package com.dongyubtcar.www;

import java.io.IOException;
import java.io.OutputStream;

import android.app.ActionBar;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.Menu;
//import android.view.View;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.view.inputmethod.EditorInfo;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
importandroid.provider.ContactsContract.CommonDataKinds.Event;
import android.content.DialogInterface;
import com.dongyubtcar.www.R;
//import android.content.DialogInterface.OnClickListener;

public class BluetoothChat extends Activity {
    //Debugging
    privatestatic final String TAG = "BluetoothChat";
    privatestatic final boolean D = true;

    // Messagetypes sent from the BluetoothChatService Handler
    publicstatic final int MESSAGE_STATE_CHANGE = 1;
    publicstatic final int MESSAGE_READ = 2;
    publicstatic final int MESSAGE_WRITE = 3;
    publicstatic final int MESSAGE_DEVICE_NAME = 4;
    publicstatic final int MESSAGE_TOAST = 5;

    // Key namesreceived from the BluetoothChatService Handler
    publicstatic final String DEVICE_NAME = "device_name";
    publicstatic final String TOAST = "toast";

    // Intentrequest codes
    privatestatic final int REQUEST_CONNECT_DEVICE_SECURE = 1;
    privatestatic final int REQUEST_CONNECT_DEVICE_INSECURE = 2;
    privatestatic final int REQUEST_ENABLE_BT = 3;
    privateOutputStream outStream = null;
    privateBluetoothSocket btSocket = null;
    // LayoutViews
   // private ListViewmConversationView;
    privateEditText mOutEditText;
    //privateButton mSendButton;
    ButtonmButton1;
    ButtonmButton2;
    ButtonmButton3;
    ButtonmButton4;
    ButtonmButton5;
    ButtonmButton6;
    ButtonmButton7;

    // Name ofthe connected device
    privateString mConnectedDeviceName = null;
    // Arrayadapter for the conversation thread
    //privateArrayAdapter<String>mConversationArrayAdapter;
    // Stringbuffer for outgoing messages
    privateStringBuffer mOutStringBuffer;
    // LocalBluetooth adapter
    privateBluetoothAdapter mBluetoothAdapter = null;
    // Memberobject for the chat services
    privateBluetoothChatService mChatService = null;


   @Override
    public voidonCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       if(D) Log.e(TAG, "+++ ON CREATE +++");

       // Set up the window layout
       setContentView(R.layout.main);

       // Get local Bluetooth adapter
       mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

       // If the adapter is null, then Bluetooth is not supported
       if (mBluetoothAdapter == null) {
           Toast.makeText(this, "Bluetooth is not available",Toast.LENGTH_LONG).show();
           finish();
           return;
       }
    }

   @Override
    public voidonStart() {
       super.onStart();
       if(D) Log.e(TAG, "++ ON START ++");

       // If BT is not on, request that it be enabled.
       // setupChat() will then be called during onActivityResult
       if (!mBluetoothAdapter.isEnabled()) {
           Intent enableIntent = newIntent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
           startActivityForResult(enableIntent, REQUEST_ENABLE_BT);
       // Otherwise, setup the chat session
       } else {
           if (mChatService == null) setupChat();
       }
       //setupButtons();
    }

   @Override
    publicsynchronized void onResume() {
       super.onResume();
       if(D) Log.e(TAG, "+ ON RESUME +");

       // Performing this check in onResume() covers the case in which BTwas
       // not enabled during onStart(), so we were paused to enableit...
       // onResume() will be called when ACTION_REQUEST_ENABLE activityreturns.
       if (mChatService != null) {
           // Only if the state is STATE_NONE, do we know that we haven'tstarted already
           if (mChatService.getState() == BluetoothChatService.STATE_NONE){
             // Start the Bluetooth chat services
             mChatService.start();
           }
       }
    }

    private voidsetupChat() {
       Log.d(TAG, "setupChat()");

       // Initialize the array adapter for the conversation thread
       //mConversationArrayAdapter = newArrayAdapter<String>(this,R.layout.main);
       //mConversationView = (ListView) findViewById(R.id.in);
       //mConversationView.setAdapter(mConversationArrayAdapter);

       // Initialize the compose field with a listener for the returnkey
       //mOutEditText = (EditText) findViewById(R.id.edit_text_out);
       //mOutEditText.setOnEditorActionListener(mWriteListener);

       // Initialize the send button with a listener that for clickevents
       //mSendButton = (Button) findViewById(R.id.button_send);
       
       // Initialize the BluetoothChatService to perform bluetoothconnections
       
       mButton1=(Button) findViewById(R.id.stop);
       mButton1.setOnClickListener(new OnClickListener() {
           public void onClick(View v) {
               // Send a message using content of the edit text widget
               //TextView view = (TextView)findViewById(R.id.edit_text_out);
               //String message = view.getText().toString();
               Stringmessage = "0";
               sendMessage(message);
               message = "0";
               sendMessage(message);
           }
       });
       
       mButton2=(Button) findViewById(R.id.forward);
       mButton2.setOnClickListener(new Button.OnClickListener() {
           public void onClick(View v) {
               // Send a message using content of the edit text widget
               //TextView view = (TextView)findViewById(R.id.edit_text_out);
               //String message = view.getText().toString();
               Stringmessage = "2";
               sendMessage(message);
               message = "2";
               sendMessage(message);
           }
       });
       mButton3=(Button) findViewById(R.id.back);
       mButton3.setOnClickListener(new Button.OnClickListener() {
           public void onClick(View v) {
               // Send a message using content of the edit text widget
               //TextView view = (TextView)findViewById(R.id.edit_text_out);
               //String message = view.getText().toString();
               Stringmessage = "8";
               sendMessage(message);
               message = "8";
               sendMessage(message);
           }
       });
       mButton4=(Button) findViewById(R.id.left);
       mButton4.setOnClickListener(new Button.OnClickListener() {
           public void onClick(View v) {
               // Send a message using content of the edit text widget
               //TextView view = (TextView)findViewById(R.id.edit_text_out);
               //String message = view.getText().toString();
               Stringmessage = "4";
               sendMessage(message);
               message = "4";
               sendMessage(message);
           }
       });
       mButton5=(Button) findViewById(R.id.right);
       mButton5.setOnClickListener(new Button.OnClickListener() {
           public void onClick(View v) {
               // Send a message using content of the edit text widget
               //TextView view = (TextView)findViewById(R.id.edit_text_out);
               //String message = view.getText().toString();
               Stringmessage = "6";
               sendMessage(message);
               message = "6";
               sendMessage(message);
           }
       });
       mButton6=(Button) findViewById(R.id.led);
       mButton6.setOnClickListener(new Button.OnClickListener() {
           public void onClick(View v) {
               // Send a message using content of the edit text widget
               //TextView view = (TextView)findViewById(R.id.edit_text_out);
               //String message = view.getText().toString();
               Stringmessage = "L";
               sendMessage(message);
               message = "L";
               sendMessage(message);
           }
       });
       mButton7=(Button) findViewById(R.id.sound);
       mButton7.setOnClickListener(new Button.OnClickListener() {
           public void onClick(View v) {
               // Send a message using content of the edit text widget
               //TextView view = (TextView)findViewById(R.id.edit_text_out);
               //String message = view.getText().toString();
               Stringmessage = "S";
               sendMessage(message);
               message = "S";
               sendMessage(message);
           }
       });
       mChatService = new BluetoothChatService(this, mHandler);

       // Initialize the buffer for outgoing messages
       mOutStringBuffer = new StringBuffer("");
    }
   
   @Override
    publicsynchronized void onPause() {
       super.onPause();
       if(D) Log.e(TAG, "- ON PAUSE -");
    }

   @Override
    public voidonStop() {
       super.onStop();
       if(D) Log.e(TAG, "-- ON STOP --");
    }

   @Override
    public voidonDestroy() {
       super.onDestroy();
       // Stop the Bluetooth chat services
       if (mChatService != null) mChatService.stop();
       if(D) Log.e(TAG, "--- ON DESTROY ---");
    }

    private voidensureDiscoverable() {
       if(D) Log.d(TAG, "ensure discoverable");
       if (mBluetoothAdapter.getScanMode() !=
           BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {
           Intent discoverableIntent = newIntent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
           discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,300);
           startActivity(discoverableIntent);
       }
    }

   
    private voidsendMessage(String message) {
       // Check that we're actually connected before trying anything
       if (mChatService.getState() !=BluetoothChatService.STATE_CONNECTED) {
           Toast.makeText(this, R.string.not_connected,Toast.LENGTH_SHORT).show();
           return;
       }

       // Check that there's actually something to send
       if (message.length() > 0) {
           // Get the message bytes and tell the BluetoothChatService towrite
           byte[] send = message.getBytes();
           mChatService.write(send);

           // Reset out string buffer to zero and clear the edit textfield
           mOutStringBuffer.setLength(0);
           //mOutEditText.setText(mOutStringBuffer);
       }
    }

    // Theaction listener for the EditText widget, to listen for the returnkey
   
    privatefinal void setStatus(int resId) {
       final ActionBar actionBar = getActionBar();
       actionBar.setSubtitle(resId);
    }

    privatefinal void setStatus(CharSequence subTitle) {
       final ActionBar actionBar = getActionBar();
       actionBar.setSubtitle(subTitle);
    }

    // TheHandler that gets information back from theBluetoothChatService
    privatefinal Handler mHandler = new Handler() {
       @Override
       public void handleMessage(Message msg) {
           switch (msg.what) {
           case MESSAGE_STATE_CHANGE:
               if(D) Log.i(TAG, "MESSAGE_STATE_CHANGE: " + msg.arg1);
               switch (msg.arg1) {
               case BluetoothChatService.STATE_CONNECTED:
                   setStatus(getString(R.string.title_connected_to,mConnectedDeviceName));
                   //mConversationArrayAdapter.clear();
                   break;
               case BluetoothChatService.STATE_CONNECTING:
                   setStatus(R.string.title_connecting);
                   break;
               case BluetoothChatService.STATE_LISTEN:
               case BluetoothChatService.STATE_NONE:
                   setStatus(R.string.title_not_connected);
                   break;
               }
               break;
           case MESSAGE_WRITE:
               //byte[] writeBuf = (byte[]) msg.obj;
               // construct a string from the buffer
               //String writeMessage = new String(writeBuf);
               //mConversationArrayAdapter.add("Me:  " +writeMessage);
               break;
           case MESSAGE_READ:
               //byte[] readBuf = (byte[]) msg.obj;
               // construct a string from the valid bytes in the buffer
              // String readMessage = new String(readBuf, 0, msg.arg1);
               //mConversationArrayAdapter.add(mConnectedDeviceName+": " + readMessage);
               break;
           case MESSAGE_DEVICE_NAME:
               // save the connected device's name
               mConnectedDeviceName = msg.getData().getString(DEVICE_NAME);
               Toast.makeText(getApplicationContext(), "Connected to "
                              + mConnectedDeviceName, Toast.LENGTH_SHORT).show();
               break;
           case MESSAGE_TOAST:
               Toast.makeText(getApplicationContext(),msg.getData().getString(TOAST),
                              Toast.LENGTH_SHORT).show();
               break;
           }
       }
    };

    public voidonActivityResult(int requestCode, int resultCode, Intent data){
       if(D) Log.d(TAG, "onActivityResult " + resultCode);
       switch (requestCode) {
       case REQUEST_CONNECT_DEVICE_SECURE:
           // When DeviceListActivity returns with a device to connect
           if (resultCode == Activity.RESULT_OK) {
               connectDevice(data, true);
           }
           break;
       case REQUEST_CONNECT_DEVICE_INSECURE:
           // When DeviceListActivity returns with a device to connect
           if (resultCode == Activity.RESULT_OK) {
               connectDevice(data, false);
           }
           break;
       case REQUEST_ENABLE_BT:
           // When the request to enable Bluetooth returns
           if (resultCode == Activity.RESULT_OK) {
               // Bluetooth is now enabled, so set up a chat session
               setupChat();
           } else {
               // User did not enable Bluetooth or an error occurred
               Log.d(TAG, "BT not enabled");
               Toast.makeText(this, R.string.bt_not_enabled_leaving,Toast.LENGTH_SHORT).show();
               finish();
           }
       }
    }

    private voidconnectDevice(Intent data, boolean secure) {
       // Get the device MAC address
       String address = data.getExtras()
           .getString(DeviceListActivity.EXTRA_DEVICE_ADDRESS);
       // Get the BluetoothDevice object
       BluetoothDevice device =mBluetoothAdapter.getRemoteDevice(address);
       // Attempt to connect to the device
       mChatService.connect(device, secure);
    }

   @Override
    publicboolean onCreateOptionsMenu(Menu menu) {
       MenuInflater inflater = getMenuInflater();
       inflater.inflate(R.menu.option_menu, menu);
       return true;
    }

   @Override
    publicboolean onOptionsItemSelected(MenuItem item) {
       Intent serverIntent = null;
       if (item.getItemId()==R.id.secure_connect_scan) {
           // Launch the DeviceListActivity to see devices and do scan
           serverIntent = new Intent(this, DeviceListActivity.class);
           startActivityForResult(serverIntent,REQUEST_CONNECT_DEVICE_SECURE);
           return true;
       }
       else if (item.getItemId()==R.id.insecure_connect_scan) {
           // Launch the DeviceListActivity to see devices and do scan
           serverIntent = new Intent(this, DeviceListActivity.class);
           startActivityForResult(serverIntent,REQUEST_CONNECT_DEVICE_INSECURE);
           return true;
       }
       else if (item.getItemId()==R.id.discoverable) {
           // Ensure this device is discoverable by others
           ensureDiscoverable();
           return true;
       }
       else if (item.getItemId()==R.id.help) {
          //requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
          setContentView(R.layout.help);
          //serverIntent = new Intent(this, help.class);
           return true;
       }
       return false;
    }

}



二、BluetoothChatService.java

 

package com.dongyubtcar.www;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.UUID;

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;


public class BluetoothChatService {
    //Debugging
    privatestatic final String TAG = "BluetoothChatService";
    privatestatic final boolean D = true;

    // Name forthe SDP record when creating server socket
    privatestatic final String NAME_SECURE = "BluetoothChatSecure";
    privatestatic final String NAME_INSECURE = "BluetoothChatInsecure";

    // UniqueUUID for this application
    privatestatic final UUID MY_UUID_SECURE =
       UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");
    privatestatic final UUID MY_UUID_INSECURE =
       UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");

    // Memberfields
    privatefinal BluetoothAdapter mAdapter;
    privatefinal Handler mHandler;
    privateAcceptThread mSecureAcceptThread;
    privateAcceptThread mInsecureAcceptThread;
    privateConnectThread mConnectThread;
    privateConnectedThread mConnectedThread;
    private intmState;

    // Constantsthat indicate the current connection state
    publicstatic final int STATE_NONE =0;      // we're doing nothing
    publicstatic final int STATE_LISTEN =1;    // now listening for incoming connections
    publicstatic final int STATE_CONNECTING = 2; // now initiating anoutgoing connection
    publicstatic final int STATE_CONNECTED = 3;  // nowconnected to a remote device

   
    publicBluetoothChatService(Context context, Handler handler) {
       mAdapter = BluetoothAdapter.getDefaultAdapter();
       mState = STATE_NONE;
       mHandler = handler;
    }

   
    privatesynchronized void setState(int state) {
       if (D) Log.d(TAG, "setState() " + mState + " -> " +state);
       mState = state;

       // Give the new state to the Handler so the UI Activity canupdate
       mHandler.obtainMessage(BluetoothChat.MESSAGE_STATE_CHANGE, state,-1).sendToTarget();
    }

   
    publicsynchronized int getState() {
       return mState;
    }

   
    publicsynchronized void start() {
       if (D) Log.d(TAG, "start");

       // Cancel any thread attempting to make a connection
       if (mConnectThread != null) {mConnectThread.cancel();mConnectThread = null;}

       // Cancel any thread currently running a connection
       if (mConnectedThread != null) {mConnectedThread.cancel();mConnectedThread = null;}

       setState(STATE_LISTEN);

       // Start the thread to listen on a BluetoothServerSocket
       if (mSecureAcceptThread == null) {
           mSecureAcceptThread = new AcceptThread(true);
           mSecureAcceptThread.start();
       }
       if (mInsecureAcceptThread == null) {
           mInsecureAcceptThread = new AcceptThread(false);
           mInsecureAcceptThread.start();
       }
    }

   
    publicsynchronized void connect(BluetoothDevice device, boolean secure){
       if (D) Log.d(TAG, "connect to: " + device);

       // Cancel any thread attempting to make a connection
       if (mState == STATE_CONNECTING) {
           if (mConnectThread != null) {mConnectThread.cancel();mConnectThread = null;}
       }

       // Cancel any thread currently running a connection
       if (mConnectedThread != null) {mConnectedThread.cancel();mConnectedThread = null;}

       // Start the thread to connect with the given device
       mConnectThread = new ConnectThread(device, secure);
       mConnectThread.start();
       setState(STATE_CONNECTING);
    }

   
    publicsynchronized void connected(BluetoothSocket socket,BluetoothDevice
           device, final String socketType) {
       if (D) Log.d(TAG, "connected, Socket Type:" + socketType);

       // Cancel the thread that completed the connection
       if (mConnectThread != null) {mConnectThread.cancel();mConnectThread = null;}

       // Cancel any thread currently running a connection
       if (mConnectedThread != null) {mConnectedThread.cancel();mConnectedThread = null;}

       // Cancel the accept thread because we only want to connect to onedevice
       if (mSecureAcceptThread != null) {
           mSecureAcceptThread.cancel();
           mSecureAcceptThread = null;
       }
       if (mInsecureAcceptThread != null) {
           mInsecureAcceptThread.cancel();
           mInsecureAcceptThread = null;
       }

       // Start the thread to manage the connection and performtransmissions
       mConnectedThread = new ConnectedThread(socket, socketType);
       mConnectedThread.start();

       // Send the name of the connected device back to the UIActivity
       Message msg =mHandler.obtainMessage(BluetoothChat.MESSAGE_DEVICE_NAME);
       Bundle bundle = new Bundle();
       bundle.putString(BluetoothChat.DEVICE_NAME,device.getName());
       msg.setData(bundle);
       mHandler.sendMessage(msg);

       setState(STATE_CONNECTED);
    }

   
    publicsynchronized void stop() {
       if (D) Log.d(TAG, "stop");

       if (mConnectThread != null) {
           mConnectThread.cancel();
           mConnectThread = null;
       }

       if (mConnectedThread != null) {
           mConnectedThread.cancel();
           mConnectedThread = null;
       }

       if (mSecureAcceptThread != null) {
           mSecureAcceptThread.cancel();
           mSecureAcceptThread = null;
       }

       if (mInsecureAcceptThread != null) {
           mInsecureAcceptThread.cancel();
           mInsecureAcceptThread = null;
       }
       setState(STATE_NONE);
    }

   
    public voidwrite(byte[] out) {
       // Create temporary object
       ConnectedThread r;
       // Synchronize a copy of the ConnectedThread
       synchronized (this) {
           if (mState != STATE_CONNECTED) return;
           r = mConnectedThread;
       }
       // Perform the write unsynchronized
       r.write(out);
    }

   
    private voidconnectionFailed() {
       // Send a failure message back to the Activity
       Message msg =mHandler.obtainMessage(BluetoothChat.MESSAGE_TOAST);
       Bundle bundle = new Bundle();
       bundle.putString(BluetoothChat.TOAST, "Unable to connectdevice");
       msg.setData(bundle);
       mHandler.sendMessage(msg);

       // Start the service over to restart listening mode
       BluetoothChatService.this.start();
    }

   
    private voidconnectionLost() {
       // Send a failure message back to the Activity
       Message msg =mHandler.obtainMessage(BluetoothChat.MESSAGE_TOAST);
       Bundle bundle = new Bundle();
       bundle.putString(BluetoothChat.TOAST, "Device connection waslost");
       msg.setData(bundle);
       mHandler.sendMessage(msg);

       // Start the service over to restart listening mode
       BluetoothChatService.this.start();
    }

   
    privateclass AcceptThread extends Thread {
       // The local server socket
       private final BluetoothServerSocket mmServerSocket;
       private String mSocketType;

       public AcceptThread(boolean secure) {
           BluetoothServerSocket tmp = null;
           mSocketType = secure ? "Secure":"Insecure";

           // Create a new listening server socket
           try {
               if (secure) {
                   tmp =mAdapter.listenUsingRfcommWithServiceRecord(NAME_SECURE,
                       MY_UUID_SECURE);
               } else {
                   tmp = mAdapter.listenUsingInsecureRfcommWithServiceRecord(
                           NAME_INSECURE, MY_UUID_INSECURE);
               }
           } catch (IOException e) {
               Log.e(TAG, "Socket Type: " + mSocketType + "listen() failed",e);
           }
           mmServerSocket = tmp;
       }

       public void run() {
           if (D) Log.d(TAG, "Socket Type: " + mSocketType +
                   "BEGIN mAcceptThread" + this);
           setName("AcceptThread" + mSocketType);

           BluetoothSocket socket = null;

           // Listen to the server socket if we're not connected
           while (mState != STATE_CONNECTED) {
               try {
                   // This is a blocking call and will only return on a
                   // successful connection or an exception
                   socket = mmServerSocket.accept();
               } catch (IOException e) {
                   Log.e(TAG, "Socket Type: " + mSocketType + "accept() failed",e);
                   break;
               }

               // If a connection was accepted
               if (socket != null) {
                   synchronized (BluetoothChatService.this) {
                       switch (mState) {
                       case STATE_LISTEN:
                       case STATE_CONNECTING:
                           // Situation normal. Start the connected thread.
                           connected(socket, socket.getRemoteDevice(),
                                   mSocketType);
                           break;
                       case STATE_NONE:
                       case STATE_CONNECTED:
                           // Either not ready or already connected. Terminate newsocket.
                           try {
                               socket.close();
                           } catch (IOException e) {
                               Log.e(TAG, "Could not close unwanted socket", e);
                           }
                           break;
                       }
                   }
               }
           }
           if (D) Log.i(TAG, "END mAcceptThread, socket Type: " +mSocketType);

       }

       public void cancel() {
           if (D) Log.d(TAG, "Socket Type" + mSocketType + "cancel " +this);
           try {
               mmServerSocket.close();
           } catch (IOException e) {
               Log.e(TAG, "Socket Type" + mSocketType + "close() of serverfailed", e);
           }
       }
    }


   
    privateclass ConnectThread extends Thread {
       private final BluetoothSocket mmSocket;
       private final BluetoothDevice mmDevice;
       private String mSocketType;

       public ConnectThread(BluetoothDevice device, boolean secure){
           mmDevice = device;
           BluetoothSocket tmp = null;
           mSocketType = secure ? "Secure" : "Insecure";

           // Get a BluetoothSocket for a connection with the
           // given BluetoothDevice
           try {
               if (secure) {
                   tmp = device.createRfcommSocketToServiceRecord(
                           MY_UUID_SECURE);
               } else {
                   tmp = device.createInsecureRfcommSocketToServiceRecord(
                           MY_UUID_INSECURE);
               }
           } catch (IOException e) {
               Log.e(TAG, "Socket Type: " + mSocketType + "create() failed",e);
           }
           mmSocket = tmp;
       }

       public void run() {
           Log.i(TAG, "BEGIN mConnectThread SocketType:" + mSocketType);
           setName("ConnectThread" + mSocketType);

           // Always cancel discovery because it will slow down aconnection
           mAdapter.cancelDiscovery();

           // Make a connection to the BluetoothSocket
           try {
               // This is a blocking call and will only return on a
               // successful connection or an exception
               mmSocket.connect();
           } catch (IOException e) {
               // Close the socket
               try {
                   mmSocket.close();
               } catch (IOException e2) {
                   Log.e(TAG, "unable to close() " + mSocketType +
                           " socket during connection failure", e2);
               }
               connectionFailed();
               return;
           }

           // Reset the ConnectThread because we're done
           synchronized (BluetoothChatService.this) {
               mConnectThread = null;
           }

           // Start the connected thread
           connected(mmSocket, mmDevice, mSocketType);
       }

       public void cancel() {
           try {
               mmSocket.close();
           } catch (IOException e) {
               Log.e(TAG, "close() of connect " + mSocketType + " socket failed",e);
           }
       }
    }

   
    privateclass ConnectedThread extends Thread {
       private final BluetoothSocket mmSocket;
       private final InputStream mmInStream;
       private final OutputStream mmOutStream;

       public ConnectedThread(BluetoothSocket socket, String socketType){
           Log.d(TAG, "create ConnectedThread: " + socketType);
           mmSocket = socket;
           InputStream tmpIn = null;
           OutputStream tmpOut = null;

           // Get the BluetoothSocket input and output streams
           try {
               tmpIn = socket.getInputStream();
               tmpOut = socket.getOutputStream();
           } catch (IOException e) {
               Log.e(TAG, "temp sockets not created", e);
           }

           mmInStream = tmpIn;
           mmOutStream = tmpOut;
       }

       public void run() {
           Log.i(TAG, "BEGIN mConnectedThread");
           byte[] buffer = new byte[1024];
           int bytes;

           // Keep listening to the InputStream while connected
           while (true) {
               try {
                   // Read from the InputStream
                   bytes = mmInStream.read(buffer);

                   // Send the obtained bytes to the UI Activity
                   mHandler.obtainMessage(BluetoothChat.MESSAGE_READ, bytes, -1,buffer)
                           .sendToTarget();
               } catch (IOException e) {
                   Log.e(TAG, "disconnected", e);
                   connectionLost();
                   // Start the service over to restart listening mode
                   BluetoothChatService.this.start();
                   break;
               }
           }
       }

       
       public void write(byte[] buffer) {
           try {
               mmOutStream.write(buffer);

               // Share the sent message back to the UI Activity
               mHandler.obtainMessage(BluetoothChat.MESSAGE_WRITE, -1, -1,buffer)
                       .sendToTarget();
           } catch (IOException e) {
               Log.e(TAG, "Exception during write", e);
           }
       }

       public void cancel() {
           try {
               mmSocket.close();
           } catch (IOException e) {
               Log.e(TAG, "close() of connect socket failed", e);
           }
       }
    }
}


三、DeviceListActivity.java

 

package com.dongyubtcar.www;

import java.util.Set;

import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;
import com.dongyubtcar.www.R;


public class DeviceListActivity extends Activity {
    //Debugging
    privatestatic final String TAG = "DeviceListActivity";
    privatestatic final boolean D = true;

    // ReturnIntent extra
    publicstatic String EXTRA_DEVICE_ADDRESS = "device_address";

    // Memberfields
    privateBluetoothAdapter mBtAdapter;
    privateArrayAdapter<String>mPairedDevicesArrayAdapter;
    privateArrayAdapter<String>mNewDevicesArrayAdapter;

   @Override
    protectedvoid onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);

       // Setup the window
       requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
       setContentView(R.layout.device_list);

       // Set result CANCELED in case the user backs out
       setResult(Activity.RESULT_CANCELED);

       // Initialize the button to perform device discovery
       Button scanButton = (Button) findViewById(R.id.button_scan);
       scanButton.setOnClickListener(new OnClickListener() {
           public void onClick(View v) {
               doDiscovery();
               v.setVisibility(View.GONE);
           }
       });

       // Initialize array adapters. One for already paired devicesand
       // one for newly discovered devices
       mPairedDevicesArrayAdapter = newArrayAdapter<String>(this,R.layout.device_name);
       mNewDevicesArrayAdapter = newArrayAdapter<String>(this,R.layout.device_name);

       // Find and set up the ListView for paired devices
       ListView pairedListView = (ListView)findViewById(R.id.paired_devices);
       pairedListView.setAdapter(mPairedDevicesArrayAdapter);
       pairedListView.setOnItemClickListener(mDeviceClickListener);

       // Find and set up the ListView for newly discovered devices
       ListView newDevicesListView = (ListView)findViewById(R.id.new_devices);
       newDevicesListView.setAdapter(mNewDevicesArrayAdapter);
       newDevicesListView.setOnItemClickListener(mDeviceClickListener);

       // Register for broadcasts when a device is discovered
       IntentFilter filter = newIntentFilter(BluetoothDevice.ACTION_FOUND);
       this.registerReceiver(mReceiver, filter);

       // Register for broadcasts when discovery has finished
       filter = newIntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
       this.registerReceiver(mReceiver, filter);

       // Get the local Bluetooth adapter
       mBtAdapter = BluetoothAdapter.getDefaultAdapter();

       // Get a set of currently paired devices
       Set<BluetoothDevice> pairedDevices =mBtAdapter.getBondedDevices();

       // If there are paired devices, add each one to theArrayAdapter
       if (pairedDevices.size() > 0) {
           findViewById(R.id.title_paired_devices).setVisibility(View.VISIBLE);
           for (BluetoothDevice device : pairedDevices) {
               mPairedDevicesArrayAdapter.add(device.getName() + "\n" +device.getAddress());
           }
       } else {
           String noDevices =getResources().getText(R.string.none_paired).toString();
           mPairedDevicesArrayAdapter.add(noDevices);
       }
    }

   @Override
    protectedvoid onDestroy() {
       super.onDestroy();

       // Make sure we're not doing discovery anymore
       if (mBtAdapter != null) {
           mBtAdapter.cancelDiscovery();
       }

       // Unregister broadcast listeners
       this.unregisterReceiver(mReceiver);
    }

   
    private voiddoDiscovery() {
       if (D) Log.d(TAG, "doDiscovery()");

       // Indicate scanning in the title
       setProgressBarIndeterminateVisibility(true);
       setTitle(R.string.scanning);

       // Turn on sub-title for new devices
       findViewById(R.id.title_new_devices).setVisibility(View.VISIBLE);

       // If we're already discovering, stop it
       if (mBtAdapter.isDiscovering()) {
           mBtAdapter.cancelDiscovery();
       }

       // Request discover from BluetoothAdapter
       mBtAdapter.startDiscovery();
    }

    // Theon-click listener for all devices in the ListViews
    privateOnItemClickListener mDeviceClickListener = newOnItemClickListener() {
       public voidonItemClick(AdapterView<?> av, Viewv, int arg2, long arg3) {
           // Cancel discovery because it's costly and we're about toconnect
           mBtAdapter.cancelDiscovery();

           // Get the device MAC address, which is the last 17 chars in theView
           String info = ((TextView) v).getText().toString();
           String address = info.substring(info.length() - 17);

           // Create the result Intent and include the MAC address
           Intent intent = new Intent();
           intent.putExtra(EXTRA_DEVICE_ADDRESS, address);

           // Set result and finish this Activity
           setResult(Activity.RESULT_OK, intent);
           finish();
       }
    };

    // TheBroadcastReceiver that listens for discovered devices and
    // changesthe title when discovery is finished
    privatefinal BroadcastReceiver mReceiver = new BroadcastReceiver() {
       @Override
       public void onReceive(Context context, Intent intent) {
           String action = intent.getAction();

           // When discovery finds a device
           if (BluetoothDevice.ACTION_FOUND.equals(action)) {
               // Get the BluetoothDevice object from the Intent
               BluetoothDevice device =intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
               // If it's already paired, skip it, because it's been listedalready
               if (device.getBondState() != BluetoothDevice.BOND_BONDED) {
                   mNewDevicesArrayAdapter.add(device.getName() + "\n" +device.getAddress());
               }
           // When discovery is finished, change the Activity title
           } else if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
               setProgressBarIndeterminateVisibility(false);
               setTitle(R.string.select_device);
               if (mNewDevicesArrayAdapter.getCount() == 0) {
                   String noDevices =getResources().getText(R.string.none_found).toString();
                   mNewDevicesArrayAdapter.add(noDevices);
               }
           }
       }
    };

}



界面布局程序layout

一、main.xml:

<?xml version="1.0"encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent" >

   <Button
       android:id="@+id/stop"
       android:layout_width="90dp"
       android:layout_height="45dp"
       android:layout_centerHorizontal="true"
       android:layout_centerVertical="true"
       android:text="@string/stop" />

   <Button
       android:id="@+id/left"
       android:layout_width="90dp"
       android:layout_height="45dp"
       android:layout_alignBaseline="@+id/stop"
       android:layout_alignBottom="@+id/stop"
       android:layout_marginRight="14dp"
       android:layout_toLeftOf="@+id/stop"
       android:text="@string/left" />

   <Button
       android:id="@+id/right"
       android:layout_width="90dp"
       android:layout_height="45dp"
       android:layout_alignBaseline="@+id/stop"
       android:layout_alignBottom="@+id/stop"
       android:layout_marginLeft="22dp"
       android:layout_toRightOf="@+id/stop"
       android:text="@string/right" />

   <Button
       android:id="@+id/forward"
       android:layout_width="90dp"
       android:layout_height="45dp"
       android:layout_above="@+id/stop"
       android:layout_marginBottom="31dp"
       android:layout_toLeftOf="@+id/right"
       android:text="@string/go" />

   <Button
       android:id="@+id/back"
       android:layout_width="90dp"
       android:layout_height="45dp"
       android:layout_below="@+id/stop"
       android:layout_marginTop="40dp"
       android:layout_toLeftOf="@+id/right"
       android:text="@string/back" />

   <Button
       android:id="@+id/sound"
       android:layout_width="90dp"
       android:layout_height="45dp"
       android:layout_above="@+id/forward"
       android:layout_alignRight="@+id/right"
       android:layout_marginBottom="29dp"
       android:layout_marginRight="10dp"
       android:text="@string/sound" />

   <Button
       android:id="@+id/led"
       android:layout_width="90dp"
       android:layout_height="45dp"
       android:layout_alignLeft="@+id/left"
       android:layout_alignTop="@+id/sound"
       android:text="@string/led" />

   <TextView
       android:id="@+id/textView1"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_alignParentTop="true"
       android:layout_centerHorizontal="true"
       android:text="@string/copyright" />

</RelativeLayout>


二、custom_title.xml

<?xml version="1.0"encoding="utf-8"?>
<!-- Copyright (C) 2009 The Android Open SourceProject

    Licensed under the Apache License, Version 2.0 (the"License");
    you may not use this file except in compliance with theLicense.
    You may obtain a copy of the License at

         http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,software
    distributed under the License is distributed on an "AS IS"BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express orimplied.
    See the License for the specific language governing permissionsand
    limitations under the License.
-->
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:gravity="center_vertical"
  >
  <TextViewandroid:id="@+id/title_left_text"
     android:layout_alignParentLeft="true"
     android:ellipsize="end"
     android:singleLine="true"
     style="?android:attr/windowTitleStyle"
     android:layout_width="wrap_content"
     android:layout_height="match_parent"
     android:layout_weight="1"
   />
   <TextView android:id="@+id/title_right_text"
       android:layout_alignParentRight="true"
       android:ellipsize="end"
       android:singleLine="true"
       android:layout_width="wrap_content"
       android:layout_height="match_parent"
       android:textColor="#fff"
       android:layout_weight="1"
   />
</RelativeLayout>


三、device_list.xml

<?xml version="1.0"encoding="utf-8"?>
<!-- Copyright (C) 2009 The Android Open SourceProject

    Licensed under the Apache License, Version 2.0 (the"License");
    you may not use this file except in compliance with theLicense.
    You may obtain a copy of the License at

         http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,software
    distributed under the License is distributed on an "AS IS"BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express orimplied.
    See the License for the specific language governing permissionsand
    limitations under the License.
-->
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="vertical"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   >
   <TextViewandroid:id="@+id/title_paired_devices"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:text="@string/title_paired_devices"
       android:visibility="gone"
       android:background="#666"
       android:textColor="#fff"
       android:paddingLeft="5dp"
   />
   <ListView android:id="@+id/paired_devices"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:stackFromBottom="true"
       android:layout_weight="1"
   />
   <TextView android:id="@+id/title_new_devices"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:text="@string/title_other_devices"
       android:visibility="gone"
       android:background="#666"
       android:textColor="#fff"
       android:paddingLeft="5dp"
   />
   <ListView android:id="@+id/new_devices"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:stackFromBottom="true"
       android:layout_weight="2"
   />
   <Button android:id="@+id/button_scan"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:text="@string/button_scan"
   />
</LinearLayout>


四、device_name.xml

<?xml version="1.0"encoding="utf-8"?>
<!-- Copyright (C) 2009 The Android Open SourceProject

    Licensed under the Apache License, Version 2.0 (the"License");
    you may not use this file except in compliance with theLicense.
    You may obtain a copy of the License at

         http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,software
    distributed under the License is distributed on an "AS IS"BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express orimplied.
    See the License for the specific language governing permissionsand
    limitations under the License.
-->
<TextViewxmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:textSize="18sp"
   android:padding="5dp"
/>


五、help.xml

<?xml version="1.0"encoding="utf-8"?>
<!-- Copyright (C) 2009 The Android Open SourceProject

    Licensed under the Apache License, Version 2.0 (the"License");
    you may not use this file except in compliance with theLicense.
    You may obtain a copy of the License at

         http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,software
    distributed under the License is distributed on an "AS IS"BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express orimplied.
    See the License for the specific language governing permissionsand
    limitations under the License.
-->
<TextViewxmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:textSize="18sp"
   android:padding="5dp"
/>


六、message.xml

<?xml version="1.0"encoding="utf-8"?>
<!-- Copyright (C) 2009 The Android Open SourceProject

    Licensed under the Apache License, Version 2.0 (the"License");
    you may not use this file except in compliance with theLicense.
    You may obtain a copy of the License at

         http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,software
    distributed under the License is distributed on an "AS IS"BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express orimplied.
    See the License for the specific language governing permissionsand
    limitations under the License.
-->
<TextViewxmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:textSize="18sp"
   android:padding="5dp"
/>



菜单界面程序menu:

option_menu.xml

<?xml version="1.0"encoding="utf-8"?>
<menuxmlns:android="http://schemas.android.com/apk/res/android">
   <item android:id="@+id/secure_connect_scan"
         android:icon="@android:drawable/ic_menu_search"
         android:title="@string/secure_connect"
         android:showAsAction="ifRoom|withText" />
   <item android:id="@+id/insecure_connect_scan"
         android:icon="@android:drawable/ic_menu_search"
         android:title="@string/insecure_connect"
         android:showAsAction="ifRoom|withText" />
   <item android:id="@+id/discoverable"
         android:icon="@android:drawable/ic_menu_mylocation"
         android:title="@string/discoverable"
         android:showAsAction="ifRoom|withText"android:menuCategory="alternative"/>
   <item android:id="@+id/help"
         android:title="@string/about"
         android:showAsAction="ifRoom|withText"android:menuCategory="alternative"/>
</menu>



配置文件AndroidManifest.xml


<?xml version="1.0"encoding="utf-8"?>
<manifestxmlns:android="http://schemas.android.com/apk/res/android"
   package="com.dongyubtcar.www"
   android:versionCode="2"
   android:versionName="2.0" >

   <uses-sdk
       android:minSdkVersion="11"
       android:targetSdkVersion="11" />

   <uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN"/>
   <uses-permissionandroid:name="android.permission.BLUETOOTH" />

   <application android:label="@string/app_name"
                android:icon="@drawable/ic_launcher" >
       <activityandroid:name="com.dongyubtcar.www.BluetoothChat"
                 android:label="@string/app_name"
                 android:configChanges="orientation|keyboardHidden">
           <intent-filter>
               <action android:name="android.intent.action.MAIN"/>
               <categoryandroid:name="android.intent.category.LAUNCHER"/>
           </intent-filter>
       </activity>
       <activityandroid:name="com.dongyubtcar.www.DeviceListActivity"
                 android:label="@string/select_device"
                 android:theme="@android:style/Theme.Holo.Dialog"
                 android:configChanges="orientation|keyboardHidden"/>
   </application>
</manifest>



你可能感兴趣的:(开源个安卓程序:蓝牙遥控智能车程序-单片机控制安卓上位机)