开源个安卓程序:蓝牙遥控智能车程序-单片机控制安卓上位机
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
二、BluetoothChatService.java
三、DeviceListActivity.java
界面布局程序layout
一、main.xml:
二、custom_title.xml
三、device_list.xml
四、device_name.xml
五、help.xml
六、message.xml
菜单界面程序menu:
配置文件AndroidManifest.xml
上个图:
主要参考安卓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>
相关文章推荐
- 单片机+手机APP蓝牙控制RGB灯的颜色变化 程序与pcb
- 51单片机智能小车C程序 蓝牙遥控+避障+自动寻迹
- 单片机中PWM的原理与控制程序
- 蓝牙控制arduino的安卓软件(基于app inventor2 )(之一:andriod软件设计篇)
- 全功能智能车之PC上位机蓝牙遥控起步(第七篇)
- 某智能车上位机程序分析
- 安卓开发关于手柄外设控制程序
- 安卓Socket连接实现连接实现发送接收数据,openwrt wifi转串口连接单片机实现控制
- 安卓Socket连接实现连接实现发送接收数据,openwrt wifi转串口连接单片机实现控制
- 用VC++6.0上位机程序控制步进电机
- 安卓手机通过蓝牙与单片机通信
- 单片机学习之PWM原理与控制程序
- 安卓手机蓝牙控制智能小车 android程序设计
- DIY 蓝牙台灯 安卓手机控制台灯
- 手机远程控制arduino蓝牙智能车制作全过程
- 开源基于CAN总线的Bootloader/IAP,含上位机及单片机源码
- 一个经典的控制Led的单片机程序
- STC15F104E (8脚单片机)实现蓝牙串口控制舵机转向
- [置顶] 单片机串口通信原理和控制程序
- 基于STM32的安卓蓝牙多功能遥控车