Я должен установить процесс получения данных Bluetooth в фоновом режиме, чтобы мне не приходилось находиться в приложении, а данные по-прежнему принимаются. Было бы неплохо иметь уведомление, чтобы вы знали, когда данные получают, и не забудьте отключить их, когда они вам больше не нужны. Каков наилучший способ сделать это? Простой передний приемник? Как отправить серийные данные в Acitvity? JobScheduler? Что-то другое? Вот код, который должен быть установлен в фоновом режиме.
public class MainActivity extends Activity {
Handler bluetoothIn;
final int handlerState = 0;
private BluetoothAdapter btAdapter = null;
private BluetoothSocket btSocket = null;
private StringBuilder recDataString = new StringBuilder();
private ConnectedThread mConnectedThread;
private static final UUID BTMODULEUUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
private static String address;
public static String EXTRA_DEVICE_ADDRESS = "device_address";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bluetoothIn = new Handler() {
public void handleMessage(android.os.Message msg) {
if (msg.what == handlerState) {
String readMessage = (String) msg.obj;
recDataString.append(readMessage);
int endOfLineIndex = recDataString.indexOf("~");
if (endOfLineIndex > 0) {
String dataInPrint =recDataString.substring
(0,endOfLineIndex);
int dataLength = dataInPrint.length();
if (dataLength==13)
{
//something
if (
//something
)
{
String sensor0 = recDataString.substring(1, 3);
sendDataMethod(sensor0);
}
}
recDataString.delete(0, recDataString.length());
}
}
}
};
btAdapter = BluetoothAdapter.getDefaultAdapter();
checkBTState();
}
private void sendDataMethod(String sensor0) {
//some math
Log.e("TAG0",Struja1);
}
private BluetoothSocket createBluetoothSocket(BluetoothDevice device) throws IOException {
return device.createRfcommSocketToServiceRecord(BTMODULEUUID);
}
@Override
public void onResume() {
super.onResume();
Intent intent = getIntent();
address = intent.getStringExtra("EXTRA_DEVICE_ADDRESS");
int pos = address.indexOf("\n");
int pos1 = address.indexOf(" ", pos);
String second = address.substring(pos+1, pos1);
BluetoothDevice device = btAdapter.getRemoteDevice(second);
try {
btSocket = createBluetoothSocket(device);
} catch (IOException e) {
Toast.makeText(getBaseContext(), "Socket creation failed", Toast.LENGTH_LONG).show();
}
try
{
btSocket.connect();
} catch (IOException e) {
try
{
btSocket.close();
} catch (IOException e2)
{
}
}
mConnectedThread = new ConnectedThread(btSocket);
mConnectedThread.start();
}
@Override
public void onPause()
{
super.onPause();
try
{
btSocket.close();
} catch (IOException e2) {
}
}
private void checkBTState() {
//code to check
}
private class ConnectedThread extends Thread {
private final InputStream mmInStream;
private final OutputStream mmOutStream;
public ConnectedThread(BluetoothSocket socket) {
InputStream tmpIn = null;
OutputStream tmpOut = null;
try {
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) { }
mmInStream = tmpIn;
mmOutStream = tmpOut;
}
public void run() {
byte[] buffer = new byte[1024];
int bytes;
while (true) {
try {
bytes = mmInStream.read(buffer);
String readMessage = new String(buffer, 0, bytes);
bluetoothIn.obtainMessage(handlerState, bytes, -1, readMessage).sendToTarget();
} catch (IOException e) {
break;
}
}
}
public void write(String input) {
byte[] msgBuffer = input.getBytes();
try {
mmOutStream.write(msgBuffer);
} catch (IOException e) {
Toast.makeText(getBaseContext(), "Connection Failure", Toast.LENGTH_LONG).show();
finish();
}
}
}
}