3

I would like to receive an event for detecting whenever bluetooth gets paired or unpaired in my device.

In the beginning i found http://developer.android.com/reference/android/bluetooth/BluetoothServerSocket.html.

I followed this blog : http://android-er.blogspot.co.il/2014/12/make-bluetooth-connection-between.html which is quite usefull, but, isn't detecting when a new connection is made.

Needless to say, I have no use for bluetooth implementation, which i'm well aware of :

 final BluetoothAdapter.LeScanCallback bleScanCallback = new BluetoothAdapter.LeScanCallback() {

            @Override
            public void onLeScan(final BluetoothDevice device, final int rssi, byte[] scanRecord) { ... }
}

Any help will be greatly appreciated.

I'm thinking i should find a way to access one of those classes : BluetoothBondStateMachine, BTConnectionReceiver, BluetoothBondStateMachine which will be a nice start, since i can see that in the logcat whenever pairing / unpairing is created, those classes detect it.

Connected to ble device "shine" :

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 Answer 1

3

So, in the end, after listening to all the events the bluetooth has to offer, i figured that i just need to listen to BluetoothDevice.ACTION_BOND_STATE_CHANGED and detect the data from the intent sent. If anyone is stuck on this issue, i hope it'll help you.

My full code :

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);
    }
}

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.