【Android源码 栏目提醒】:以下是网学会员为您推荐的Android源码 -BluetoothChatService.java android源代码 - 编程语言,希望本篇文章对您学习有所帮助。
BluetoothChatService.java
android源代码 / Copyright C 2009 The
Android Open Source Project Licensed under the Apache License Version 2.0 the License you may not use this file except in compliance with the License. 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 or implied. See the License for the specific language governing permissions and limitations under the License. / package com.example.
android.BluetoothChat 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 / This class does all the work for setting up and managing Bluetooth connections with other devices. It has a thread that listens for incoming connections a thread for connecting with a device and a thread for performing data transmissions when connected. / public class BluetoothChatService // Debugging private static final String TAG BluetoothChatService private static final boolean D true // Name for the SDP record when creating server socket private static final String NAME BluetoothChat // Unique UUID for this application private static final UUID MY_UUID UUID.fromStringfa87c0d0-afac-11de-8a39-0800200c9a66 // Member fields private final BluetoothAdapter mAdapter private final Handler mHandler private AcceptThread mAcceptThread private ConnectThread mConnectThread private ConnectedThread mConnectedThread private int mState // Constants that indicate the current connection state public static final int STATE_NONE 0 // were doing nothing public static final int STATE_LISTEN 1 // now listening for incoming connections public static final int STATE_CONNECTING 2 // now initiating an outgoing connection public static final int STATE_CONNECTED 3 // now connected to a remote device / Constructor. Prepares a new BluetoothChat session. param context The UI Activity Context param handler A Handler to send messages back to the UI Activity / public BluetoothChatServiceContext context Handler handler mAdapter BluetoothAdapter.getDefaultAdapter mState STATE_NONE mHandler handler / Set the current state of the chat connection param state An integer defining the current connection state / private synchronized void setStateint state if D Log.dTAG setState mState - state mState state // Give the new state to the Handler so the UI Activity can update mHandler.obtainMessageBluetoothChat.MESSAGE_STATE_CHANGE state -1.sendToTarget / Return the current connection state. / public synchronized int getState return mState / Start the chat service. Specifically start AcceptThread to begin a session in listening server mode. Called by the Activity onResume / public synchronized void start if D Log.dTAG 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 // Start the thread to listen on a BluetoothServerSocket if mAcceptThread null mAcceptThread new AcceptThread mAcceptThread.start setStateSTATE_LISTEN / Start the ConnectThread to initiate a connection to a remote device. param device The BluetoothDevice to connect / public synchronized void connectBluetoothDevice device if D Log.dTAG 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 ConnectThreaddevice mConnectThread.start setStateSTATE_CONNECTING / Start the ConnectedThread to begin managing a Bluetooth connection param socket The BluetoothSocket on which the connection was made param device The BluetoothDevice that has been connected / public synchronized void connectedBluetoothSocket socket BluetoothDevice device if D Log.dTAG connected // 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 one device if mAcceptThread null mAcceptThread.cancel mAcceptThread null // Start the thread to manage the connection and perform transmissions mConnectedThread new ConnectedThreadsocket mConnectedThread.start // Send the name of the connected device back to the UI Activity Message msg mHandler.obtainMessageBluetoothChat.MESSAGE_DEVICE_NAME Bundle bundle new Bundle bundle.putStringBluetoothChat.DEVICE_NAME device.getName msg.setDatabundle mHandler.sendMessagemsg setStateSTATE_CONNECTED / Stop all threads / public synchronized void stop if D Log.dTAG stop if mConnectThread null mConnectThread.cancel mConnectThread null if mConnectedThread null mConnectedThread.cancel mConnectedThread null if mAcceptThread null mAcceptThread.cancel mAcceptThread null setStateSTATE_NONE / Write to the ConnectedThread in an unsynchronized manner param out The bytes to write see ConnectedThreadwritebyte / public void writebyte 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.writeout / Indicate that the connection attempt failed and notify the UI Activity. / private void connectionFailed setStateSTATE_LISTEN // Send a failure message back to the Activity Message msg mHandler.obtainMessageBluetoothChat.MESSAGE_TOAST Bundle bundle new Bundle bundle.putStringBluetoothChat.TOAST Unable to connect device msg.setDatabundle mHandler.sendMessagemsg / Indicate that the connection was lost and notify the UI Activity. / private void connectionLost setStateSTATE_LISTEN // Send a failure message back to the Activity Message msg mHandler.obtainMessageBluetoothChat.MESSAGE_TOAST Bundle bundle new Bundle bundle.putStringBluetoothChat.TOAST Device connection was lost msg.setDatabundle mHandler.sendMessagemsg / This thread runs while listening for incoming connections. It behaves like a server-side client. It runs until a connection is accepted or until cancelled. / private class AcceptThread extends Thread // The local server socket private final BluetoothServerSocket mmServerSocket public AcceptThread BluetoothServerSocket tmp null // Create a new listening server socket try tmp mAdapter.listenUsingRfcommWithServiceRecordNAME MY_UUID catch IOException e Log.eTAG listen failed e mmServerSocket tmp public void run if D Log.dTAG BEGIN mAcceptThread this setNameAcceptThread BluetoothSocket socket null // Listen to the server socket if were 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.eTAG 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. connectedsocket socket.getRemoteDevice break case STATE_NONE: case STATE_CONNECTED: // Either not ready or already connected. Terminate new socket. try socket.close catch IOException e Log.eTAG Could not close unwanted socket e break if D Log.iTAG END mAcceptThread public void cancel if D Log.dTAG cancel this try mmServerSocket.close catch IOException e Log.eTAG close of server failed e / This thread runs while attempting to make an outgoing connection with a device. It runs straight through the connection either succeeds or fails. / private class ConnectThread extends Thread private final BluetoothSocket mmSocket private final BluetoothDevice mmDevice public ConnectThreadBluetoothDevice device mmDevice device BluetoothSocket tmp null // Get a BluetoothSocket for a connection with the // given BluetoothDevice try tmp device.createRfcommSocketToServiceRecordMY_UUID catch IOException e Log.eTAG create failed e mmSocket tmp public void run Log.iTAG BEGIN mConnectThread setNameConnectThread // Always cancel discovery because it will slow down a connection 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 connectionFailed // Close the socket try mmSocket.close catch IOException e2 Log.eTAG unable to close socket during connection failure e2 // Start the service over to restart listening mode BluetoothChatService.this.start return // Reset the ConnectThread because were done synchronized BluetoothChatService.this mConnectThread null // Start the connected thread connectedmmSocket mmDevice public void cancel try mmSocket.close catch IOException e Log.eTAG close of connect socket failed e / This thread runs during a connection with a remote device. It handles all incoming and outgoing transmissions. / private class ConnectedThread extends Thread private final BluetoothSocket mmSocket private final InputStream mmInStream private final OutputStream mmOutStream public ConnectedThreadBluetoothSocket socket Log.dTAG create ConnectedThread 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.eTAG temp sockets not created e mmInStream tmpIn mmOutStream tmpOut public void run Log.iTAG BEGIN mConnectedThread byte buffer new byte1024 int bytes // Keep listening to the InputStream while connected while true try // Read from the InputStream bytes mmInStream.readbuffer // Send the obtained bytes to the UI Activity mHandler.obtainMessageBluetoothChat.MESSAGE_READ bytes -1 buffer .sendToTarget catch IOException e Log.eTAG disconnected e connectionLost break / Write to the connected OutStream. param buffer The bytes to write / public void writebyte buffer try mmOutStream.writebuffer // Share the sent message back to the UI Activity mHandler.obtainMessageBluetoothChat.MESSAGE_WRITE -1 -1 buffer .sendToTarget catch IOException e Log.eTAG Exception during write e public void cancel try mmSocket.close catch IOException e Log.eTAG close of connect socket failed e