您的位置:首页 > 其它

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

2013-07-19 22:51 489 查看
  大二寒假学做蓝牙遥控智能车,也就学了安卓编程,写了这个安卓遥控程序。这是第一版本,用按钮实现控制的,等我把重力感应控制的那个程序做稳定了再开源。

   上个图:

      


  主要参考安卓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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: