怎么用蓝牙给单片机与蓝牙模块通信下载程序,电脑自带蓝牙功能。

下次自动登录
现在的位置:
& 综合 & 正文
开源个安卓程序:蓝牙遥控智能车程序-单片机控制安卓上位机
大二寒假学做蓝牙遥控智能车,也就学了安卓编程,写了这个安卓遥控。这是第一版本,用按钮实现控制的,等我把重力感应控制的那个程序做稳定了再开源。
主要参考安卓SDK自带的开源例程,所以觉得还是有必要开的,不想自己建工程可以直接下载apk包:
ishare..cn/f/.html
http://download.csdn.net/detail/canyue102/5749027博主最近在电脑上自建了博客,以后也用那个了,欢迎关注访问,里面也有很多有用资源:
开发环境: ubuntu+eclipse+adt+java
主要程序:
JAVA程序:
一、BluetoothChat.java
package com.dongyubtcar.
import java.io.IOE
import java.io.OutputS
import android.app.ActionB
import android.app.A
import android.bluetooth.BluetoothA
import android.bluetooth.BluetoothD
import android.bluetooth.BluetoothS
import android.content.I
import android.os.B
import android.os.H
import android.os.M
import android.util.L
import android.view.KeyE
import android.view.MotionE
import android.view.M
//import android.view.V
import android.view.MenuI
import android.view.MenuI
import android.view.V
import android.view.W
import android.view.View.OnClickL
import android.view.inputmethod.EditorI
import android.widget.ArrayA
import android.widget.B
import android.widget.EditT
import android.widget.ListV
import android.widget.TextV
import android.widget.T
importandroid.monDataKinds.E
import android.content.DialogI
import com.dongyubtcar.www.R;
//import android.content.DialogInterface.OnClickL
public class BluetoothChat extends Activity {
//Debugging
privatestatic final String TAG = "BluetoothChat";
privatestatic final boolean D =
// 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 =
privateBluetoothSocket btSocket =
// LayoutViews
// private ListViewmConversationV
privateEditText mOutEditT
//privateButton mSendB
ButtonmButton1;
ButtonmButton2;
ButtonmButton3;
ButtonmButton4;
ButtonmButton5;
ButtonmButton6;
ButtonmButton7;
// Name ofthe connected device
privateString mConnectedDeviceName =
// Arrayadapter for the conversation thread
//privateArrayAdapter&String&mConversationArrayA
// Stringbuffer for outgoing messages
privateStringBuffer mOutStringB
// LocalBluetooth adapter
privateBluetoothAdapter mBluetoothAdapter =
// Memberobject for the chat services
privateBluetoothChatService mChatService =
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();
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
if (mChatService == null) setupChat();
//setupButtons();
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("");
publicsynchronized void onPause() {
super.onPause();
if(D) Log.e(TAG, "- ON PAUSE -");
public voidonStop() {
super.onStop();
if(D) Log.e(TAG, "-- ON STOP --");
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();
// 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() {
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();
case BluetoothChatService.STATE_CONNECTING:
setStatus(R.string.title_connecting);
case BluetoothChatService.STATE_LISTEN:
case BluetoothChatService.STATE_NONE:
setStatus(R.string.title_not_connected);
case MESSAGE_WRITE:
//byte[] writeBuf = (byte[]) msg.
// construct a string from the buffer
//String writeMessage = new String(writeBuf);
//mConversationArrayAdapter.add("Me:
" +writeMessage);
case MESSAGE_READ:
//byte[] readBuf = (byte[]) msg.
// construct a string from the valid bytes in the buffer
// String readMessage = new String(readBuf, 0, msg.arg1);
//mConversationArrayAdapter.add(mConnectedDeviceName+": " + readMessage);
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();
case MESSAGE_TOAST:
Toast.makeText(getApplicationContext(),msg.getData().getString(TOAST),
Toast.LENGTH_SHORT).show();
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);
case REQUEST_CONNECT_DEVICE_INSECURE:
// When DeviceListActivity returns with a device to connect
if (resultCode == Activity.RESULT_OK) {
connectDevice(data, false);
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();
// 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();
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);
publicboolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.option_menu, menu);
publicboolean onOptionsItemSelected(MenuItem item) {
Intent serverIntent =
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);
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);
else if (item.getItemId()==R.id.discoverable) {
// Ensure this device is discoverable by others
ensureDiscoverable();
else if (item.getItemId()==R.id.help) {
//requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.help);
//serverIntent = new Intent(this, help.class);
二、BluetoothChatService.java
package com.dongyubtcar.
import java.io.IOE
import java.io.InputS
import java.io.OutputS
import java.util.UUID;
import android.bluetooth.BluetoothA
import android.bluetooth.BluetoothD
import android.bluetooth.BluetoothServerS
import android.bluetooth.BluetoothS
import android.content.C
import android.os.B
import android.os.H
import android.os.M
import android.util.L
public class BluetoothChatService {
//Debugging
privatestatic final String TAG = "BluetoothChatService";
privatestatic final boolean D =
// 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("0-805f9b34fb");
privatestatic final UUID MY_UUID_INSECURE =
UUID.fromString("0-805f9b34fb");
// Memberfields
privatefinal BluetoothAdapter mA
privatefinal Handler mH
privateAcceptThread mSecureAcceptT
privateAcceptThread mInsecureAcceptT
privateConnectThread mConnectT
privateConnectedThread mConnectedT
private intmS
// 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 =
privatesynchronized void setState(int state) {
if (D) Log.d(TAG, "setState() " + 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() {
publicsynchronized void start() {
if (D) Log.d(TAG, "start");
// Cancel any thread attempting to make a connection
if (mConnectThread != null) {mConnectThread.cancel();mConnectThread =}
// Cancel any thread currently running a connection
if (mConnectedThread != null) {mConnectedThread.cancel();mConnectedThread =}
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 =}
// Cancel any thread currently running a connection
if (mConnectedThread != null) {mConnectedThread.cancel();mConnectedThread =}
// 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 =}
// Cancel any thread currently running a connection
if (mConnectedThread != null) {mConnectedThread.cancel();mConnectedThread =}
// Cancel the accept thread because we only want to connect to onedevice
if (mSecureAcceptThread != null) {
mSecureAcceptThread.cancel();
mSecureAcceptThread =
if (mInsecureAcceptThread != null) {
mInsecureAcceptThread.cancel();
mInsecureAcceptThread =
// 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 =
if (mConnectedThread != null) {
mConnectedThread.cancel();
mConnectedThread =
if (mSecureAcceptThread != null) {
mSecureAcceptThread.cancel();
mSecureAcceptThread =
if (mInsecureAcceptThread != null) {
mInsecureAcceptThread.cancel();
mInsecureAcceptThread =
setState(STATE_NONE);
public voidwrite(byte[] out) {
// Create temporary object
ConnectedT
// Synchronize a copy of the ConnectedThread
synchronized (this) {
if (mState != STATE_CONNECTED)
r = mConnectedT
// 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 mmServerS
private String mSocketT
public AcceptThread(boolean secure) {
BluetoothServerSocket tmp =
mSocketType = secure ? "Secure":"Insecure";
// Create a new listening server socket
if (secure) {
tmp =mAdapter.listenUsingRfcommWithServiceRecord(NAME_SECURE,
MY_UUID_SECURE);
tmp = mAdapter.listenUsingInsecureRfcommWithServiceRecord(
NAME_INSECURE, MY_UUID_INSECURE);
} catch (IOException e) {
Log.e(TAG, "Socket Type: " + mSocketType + "listen() failed",e);
mmServerSocket =
public void run() {
if (D) Log.d(TAG, "Socket Type: " + mSocketType +
"BEGIN mAcceptThread" + this);
setName("AcceptThread" + mSocketType);
BluetoothSocket socket =
// Listen to the server socket if we're not connected
while (mState != STATE_CONNECTED) {
// 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);
// 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);
case STATE_NONE:
case STATE_CONNECTED:
// Either not ready or already connected. Terminate newsocket.
socket.close();
} catch (IOException e) {
Log.e(TAG, "Could not close unwanted socket", e);
if (D) Log.i(TAG, "END mAcceptThread, socket Type: " +mSocketType);
public void cancel() {
if (D) Log.d(TAG, "Socket Type" + mSocketType + "cancel " +this);
mmServerSocket.close();
} catch (IOException e) {
Log.e(TAG, "Socket Type" + mSocketType + "close() of serverfailed", e);
privateclass ConnectThread extends Thread {
private final BluetoothSocket mmS
private final BluetoothDevice mmD
private String mSocketT
public ConnectThread(BluetoothDevice device, boolean secure){
mmDevice =
BluetoothSocket tmp =
mSocketType = secure ? "Secure" : "Insecure";
// Get a BluetoothSocket for a connection with the
// given BluetoothDevice
if (secure) {
tmp = device.createRfcommSocketToServiceRecord(
MY_UUID_SECURE);
tmp = device.createInsecureRfcommSocketToServiceRecord(
MY_UUID_INSECURE);
} catch (IOException e) {
Log.e(TAG, "Socket Type: " + mSocketType + "create() failed",e);
mmSocket =
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
// This is a blocking call and will only return on a
// successful connection or an exception
mmSocket.connect();
} catch (IOException e) {
// Close the socket
mmSocket.close();
} catch (IOException e2) {
Log.e(TAG, "unable to close() " + mSocketType +
" socket during connection failure", e2);
connectionFailed();
// Reset the ConnectThread because we're done
synchronized (BluetoothChatService.this) {
mConnectThread =
// Start the connected thread
connected(mmSocket, mmDevice, mSocketType);
public void cancel() {
mmSocket.close();
} catch (IOException e) {
Log.e(TAG, "close() of connect " + mSocketType + " socket failed",e);
privateclass ConnectedThread extends Thread {
private final BluetoothSocket mmS
private final InputStream mmInS
private final OutputStream mmOutS
public ConnectedThread(BluetoothSocket socket, String socketType){
Log.d(TAG, "create ConnectedThread: " + socketType);
mmSocket =
InputStream tmpIn =
OutputStream tmpOut =
// Get the BluetoothSocket input and output streams
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) {
Log.e(TAG, "temp sockets not created", e);
mmInStream = tmpIn;
mmOutStream = tmpO
public void run() {
Log.i(TAG, "BEGIN mConnectedThread");
byte[] buffer = new byte[1024];
// Keep listening to the InputStream while connected
while (true) {
// 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();
public void write(byte[] buffer) {
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() {
mmSocket.close();
} catch (IOException e) {
Log.e(TAG, "close() of connect socket failed", e);
三、DeviceListActivity.java
package com.dongyubtcar.
import java.util.S
import android.app.A
import android.bluetooth.BluetoothA
import android.bluetooth.BluetoothD
import android.content.BroadcastR
import android.content.C
import android.content.I
import android.content.IntentF
import android.os.B
import android.util.L
import android.view.V
import android.view.W
import android.view.View.OnClickL
import android.widget.AdapterV
import android.widget.ArrayA
import android.widget.B
import android.widget.ListV
import android.widget.TextV
import android.widget.AdapterView.OnItemClickL
import com.dongyubtcar.www.R;
public class DeviceListActivity extends Activity {
//Debugging
privatestatic final String TAG = "DeviceListActivity";
privatestatic final boolean D =
// ReturnIntent extra
publicstatic String EXTRA_DEVICE_ADDRESS = "device_address";
// Memberfields
privateBluetoothAdapter mBtA
privateArrayAdapter&String&mPairedDevicesArrayA
privateArrayAdapter&String&mNewDevicesArrayA
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());
String noDevices =getResources().getText(R.string.none_paired).toString();
mPairedDevicesArrayAdapter.add(noDevices);
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);
// TheBroadcastReceiver that listens for discovered devices and
// changesthe title when discovery is finished
privatefinal BroadcastReceiver mReceiver = new BroadcastReceiver() {
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="/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" &
android:id="@+id/stop"
android:layout_width="90dp"
android:layout_height="45dp"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:text="@string/stop" /&
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" /&
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" /&
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" /&
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" /&
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" /&
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" /&
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="/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="/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="/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="/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="/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="/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"/&
配置文件AndroidManifest.xml
&?xml version="1.0"encoding="utf-8"?&
&manifestxmlns:android="/apk/res/android"
package="com.dongyubtcar.www"
android:versionCode="2"
android:versionName="2.0" &
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&
&&&&推荐文章:
【上篇】【下篇】}

我要回帖

更多关于 单片机蓝牙模块 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信