Как обнаружить, когда мое устройство Android подключается / отключается от сопряженного устройства Bluetooth
Я хотел бы получить событие для обнаружения, когда bluetooth подключен или не подключен в моем устройстве.
В начале я нашел http://developer.android.com/reference/android/bluetooth/BluetoothServerSocket.html.
Я следил за этим блогом: http://android-er.blogspot.co.il/2014/12/make-bluetooth-connection-between.html который весьма полезен, но не определяет, когда устанавливается новое соединение.Излишне говорить, что я не пользуюсь реализацией Bluetooth, о которой я хорошо знаю:
final BluetoothAdapter.LeScanCallback bleScanCallback = new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice device, final int rssi, byte[] scanRecord) { ... }
}
Любая помощь будет оценена.
Я думаю, что я должен найти способ получить доступ к одному из этих классов: BluetoothBondStateMachine, BTConnectionReceiver, BluetoothBondStateMachine, который будет хорошим началом, так как я вижу это в logcat, когда создается спаривание / отключение, эти классы обнаруживают его.
Подключено к бле устройство "блеск":07-28 18:05:49.284 8332-8332/? I/BTConnectionReceiver﹕ onReceive(context, Intent { act=android.bluetooth.device.action.ACL_CONNECTED flg=0x4000010 cmp=com.google.android.googlequicksearchbox/com.google.android.search.core.service.BluetoothConnectionReceiver (has extras) }, [BluetoothDevice: address=F2:3F:FB:30:A1:75, alias=null, name=Shine, majorDeviceClass=7936, deviceClass=7936]
07-28 18:05:49.285 8332-8332/? I/BluetoothClassifier﹕ Bluetooth Device Name: Shine
07-28 18:05:49.830 19769-19793/? W/bt_smp﹕ smp_send_id_info
07-28 18:05:49.836 19769-19786/? I/BluetoothBondStateMachine﹕ bondStateChangeCallback: Status: 0 Address: F2:3F:FB:30:A1:75 newState: 2
07-28 18:05:49.838 19769-19787/? I/BluetoothBondStateMachine﹕ Bond State Change Intent:F2:3F:FB:30:A1:75 OldState: 11 NewState: 12
07-28 18:05:49.838 19769-19787/? I/BluetoothBondStateMachine﹕ StableState(): Entering Off State
07-28 18:05:50.564 19769-19793/? E/bt_att﹕ gatt_disc_cmpl_cback() - Register for service changed indication failure
07-28 18:05:51.189 19769-19793/? W/bt_bta_gattc﹕ bta_gattc_explore_srvc no more services found
07-28 18:05:51.191 19769-19793/? I/bt_bta_dm﹕ bta_dm_gatt_disc_result service_id_uuid_len=2
1 ответ
Итак, в конце концов, после прослушивания всех событий, которые может предложить Bluetooth, я решил, что мне просто нужно слушать BluetoothDevice.ACTION_BOND_STATE_CHANGED
и обнаружить данные от отправленного намерения. Если кто-то застрянет в этом вопросе, я надеюсь, он вам поможет.
Мой полный код:
public class MainActivity extends Activity {
private TextView mTextLog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextLog = (TextView) findViewById(R.id.text_log);
registerReceiver(mReceiver, new IntentFilter(BluetoothDevice.ACTION_BOND_STATE_CHANGED));
}
@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(mReceiver);
}
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
int state = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE,
BluetoothDevice.ERROR);
if (state == BluetoothDevice.BOND_BONDED) {
attachText("Device " + device + " PAIRED");
} else if (state == BluetoothDevice.BOND_BONDING) {
attachText("Device " + device + " pairing is in process...");
} else if (state == BluetoothDevice.BOND_NONE) {
attachText("Device " + device + " is unpaired");
} else {
attachText("Device " + device + " is in undefined state");
}
}
};
private void attachText(String text) {
String currentText = mTextLog.getText() == null ? "" : mTextLog.getText().toString();
mTextLog.setText(currentText + "\n" + text);
}
}