http://www.embbnux.com
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; } }
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); } } } }
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); } } } }; }
<?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>
<?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>
<?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>
<?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" />
<?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" />
<?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" />
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>
<?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>