您可以将所有蓝牙连接代码移动到服务类中.

考虑将其用作路线图.

public class BluetoothDataService extends Service {

final int handlerState = 0; //used to identify handler message

Handler bluetoothIn;

private BluetoothAdapter btAdapter = null;

private ConnectingThread mConnectingThread;

private ConnectedThread mConnectedThread;

private boolean stopThread;

// SPP UUID service - this should work for most devices

private static final UUID BTMODULEUUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

// String for MAC address

private static final String MAC_ADDRESS = "YOUR:MAC:ADDRESS:HERE";

private StringBuilder recDataString = new StringBuilder();

@Override

public void onCreate() {

super.onCreate();

Log.d("BT SERVICE","SERVICE CREATED");

stopThread = false;

}

@Override

public int onStartCommand(Intent intent,int flags,int startId) {

Log.d("BT SERVICE","SERVICE STARTED");

bluetoothIn = new Handler() {

public void handleMessage(android.os.Message msg) {

Log.d("DEBUG","handleMessage");

if (msg.what == handlerState) { //if message is what we want

String readMessage = (String) msg.obj; // msg.arg1 = bytes from connect thread

recDataString.append(readMessage);`enter code here`

Log.d("RECORDED",recDataString.toString());

// Do stuff here with your data,like adding it to the database

}

recDataString.delete(0,recDataString.length()); //clear all string data

}

}

}

};

btAdapter = BluetoothAdapter.getDefaultAdapter(); // get Bluetooth adapter

checkBTState();

return super.onStartCommand(intent,flags,startId);

}

@Override

public void onDestroy() {

super.onDestroy();

bluetoothIn.removeCallbacksAndMessages(null);

stopThread = true;

if (mConnectedThread != null) {

mConnectedThread.closeStreams();

}

if (mConnectingThread != null) {

mConnectingThread.closeSocket();

}

Log.d("SERVICE","onDestroy");

}

@Nullable

@Override

public IBinder onBind(Intent intent) {

return null;

}

//Checks that the Android device Bluetooth is available and prompts to be turned on if off

private void checkBTState() {

if (btAdapter == null) {

Log.d("BT SERVICE","BLUETOOTH NOT SUPPORTED BY DEVICE,STOPPING SERVICE");

stopSelf();

} else {

if (btAdapter.isEnabled()) {

Log.d("DEBUG BT","BT ENABLED! BT ADDRESS : " + btAdapter.getAddress() + ",BT NAME : " + btAdapter.getName());

try {

BluetoothDevice device = btAdapter.getRemoteDevice(MAC_ADDRESS);

Log.d("DEBUG BT","ATTEMPTING TO CONNECT TO REMOTE DEVICE : " + MAC_ADDRESS);

mConnectingThread = new ConnectingThread(device);

mConnectingThread.start();

} catch (IllegalArgumentException e) {

Log.d("DEBUG BT","PROBLEM WITH MAC ADDRESS : " + e.toString());

Log.d("BT SEVICE","ILLEGAL MAC ADDRESS,STOPPING SERVICE");

stopSelf();

}

} else {

Log.d("BT SERVICE","BLUETOOTH NOT ON,STOPPING SERVICE");

stopSelf();

}

}

}

// New Class for Connecting Thread

private class ConnectingThread extends Thread {

private final BluetoothSocket mmSocket;

private final BluetoothDevice mmDevice;

public ConnectingThread(BluetoothDevice device) {

Log.d("DEBUG BT","IN CONNECTING THREAD");

mmDevice = device;

BluetoothSocket temp = null;

Log.d("DEBUG BT","MAC ADDRESS : " + MAC_ADDRESS);

Log.d("DEBUG BT","BT UUID : " + BTMODULEUUID);

try {

temp = mmDevice.createRfcommSocketToServiceRecord(BTMODULEUUID);

Log.d("DEBUG BT","SOCKET CREATED : " + temp.toString());

} catch (IOException e) {

Log.d("DEBUG BT","SOCKET CREATION FAILED :" + e.toString());

Log.d("BT SERVICE","SOCKET CREATION FAILED,STOPPING SERVICE");

stopSelf();

}

mmSocket = temp;

}

@Override

public void run() {

super.run();

Log.d("DEBUG BT","IN CONNECTING THREAD RUN");

// Establish the Bluetooth socket connection.

// Cancelling discovery as it may slow down connection

btAdapter.cancelDiscovery();

try {

mmSocket.connect();

Log.d("DEBUG BT","BT SOCKET CONNECTED");

mConnectedThread = new ConnectedThread(mmSocket);

mConnectedThread.start();

Log.d("DEBUG BT","CONNECTED THREAD STARTED");

//I send a character when resuming.beginning transmission to check device is connected

//If it is not an exception will be thrown in the write method and finish() will be called

mConnectedThread.write("x");

} catch (IOException e) {

try {

Log.d("DEBUG BT","SOCKET CONNECTION FAILED : " + e.toString());

Log.d("BT SERVICE","SOCKET CONNECTION FAILED,STOPPING SERVICE");

mmSocket.close();

stopSelf();

} catch (IOException e2) {

Log.d("DEBUG BT","SOCKET CLOSING FAILED :" + e2.toString());

Log.d("BT SERVICE","SOCKET CLOSING FAILED,STOPPING SERVICE");

stopSelf();

//insert code to deal with this

}

} catch (IllegalStateException e) {

Log.d("DEBUG BT","CONNECTED THREAD START FAILED : " + e.toString());

Log.d("BT SERVICE","CONNECTED THREAD START FAILED,STOPPING SERVICE");

stopSelf();

}

}

public void closeSocket() {

try {

//Don't leave Bluetooth sockets open when leaving activity

mmSocket.close();

} catch (IOException e2) {

//insert code to deal with this

Log.d("DEBUG BT",e2.toString());

Log.d("BT SERVICE",STOPPING SERVICE");

stopSelf();

}

}

}

// New Class for Connected Thread

private class ConnectedThread extends Thread {

private final InputStream mmInStream;

private final OutputStream mmOutStream;

//creation of the connect thread

public ConnectedThread(BluetoothSocket socket) {

Log.d("DEBUG BT","IN CONNECTED THREAD");

InputStream tmpIn = null;

OutputStream tmpOut = null;

try {

//Create I/O streams for connection

tmpIn = socket.getInputStream();

tmpOut = socket.getOutputStream();

} catch (IOException e) {

Log.d("DEBUG BT",e.toString());

Log.d("BT SERVICE","UNABLE TO READ/WRITE,STOPPING SERVICE");

stopSelf();

}

mmInStream = tmpIn;

mmOutStream = tmpOut;

}

public void run() {

Log.d("DEBUG BT","IN CONNECTED THREAD RUN");

byte[] buffer = new byte[256];

int bytes;

// Keep looping to listen for received messages

while (true && !stopThread) {

try {

bytes = mmInStream.read(buffer); //read bytes from input buffer

String readMessage = new String(buffer,bytes);

Log.d("DEBUG BT PART","CONNECTED THREAD " + readMessage);

// Send the obtained bytes to the UI Activity via handler

bluetoothIn.obtainMessage(handlerState,bytes,-1,readMessage).sendToTarget();

} catch (IOException e) {

Log.d("DEBUG BT",e.toString());

Log.d("BT SERVICE",STOPPING SERVICE");

stopSelf();

break;

}

}

}

//write method

public void write(String input) {

byte[] msgBuffer = input.getBytes(); //converts entered String into bytes

try {

mmOutStream.write(msgBuffer); //write bytes over BT connection via outstream

} catch (IOException e) {

//if you cannot write,close the application

Log.d("DEBUG BT","UNABLE TO READ/WRITE " + e.toString());

Log.d("BT SERVICE",STOPPING SERVICE");

stopSelf();

}

}

public void closeStreams() {

try {

//Don't leave Bluetooth sockets open when leaving activity

mmInStream.close();

mmOutStream.close();

} catch (IOException e2) {

//insert code to deal with this

Log.d("DEBUG BT","STREAM CLOSING FAILED,STOPPING SERVICE");

stopSelf();

}

}

}

}

这是要消化的大量代码,需要了解具有蓝牙连接的线程和处理程序等内容.

不确定您的专业知识,因此有一些注释可以帮助您学习代码和日志消息,这将有助于您了解代码流.

还要确保在Manifest文件AndroidManifest.xml中声明此服务

您需要熟悉的一些主题

http://developer.android.com/guide/topics/connectivity/bluetooth.html

http://developer.android.com/reference/android/app/Service.html

http://developer.android.com/reference/java/lang/Thread.html

http://developer.android.com/reference/android/os/Handler.html

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐