How to programmatically pair a bluetooth device on Android

后端 未结 10 1946
轻奢々
轻奢々 2020-11-30 23:27

For my application I\'m trying to programmatically pair a bluetooth device. I\'m able to show the pairing dialog for the device I want to pair and I can enter a pincode. Whe

10条回答
  •  暗喜
    暗喜 (楼主)
    2020-11-30 23:58

    I managed to auto request a pairing procedure with keyboard featured devices through an app working as a service checking the presence of a specific kind of device and a modified version of the Settings app.

    I have to say that I was working on a custom device running Android 4.0.3 without external controls (no back/Home/confirm buttons): pairing a controller on boot complete without any interaction until PIN request was mandatory.

    First I created a service starting an activity on boot (with android.intent.action.BOOT_COMPLETED and android.permission.RECEIVE_BOOT_COMPLETED) that checks periodically the presence of a 1344 class device (a keyboard, the only way to input data on request) on the onReceive callback:

    public void onReceive(Context context, Intent intent) 
    ...
        BluetoothDevice dev = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
    ...
    if(dev.getBluetoothClass().getDeviceClass() == 1344){...}
    

    Once filtered I choose the first keyboard available and then I pass the BT address to the Settings app:

    Intent btSettingsIntent = new Intent(Settings.ACTION_BLUETOOTH_SETTINGS);
    btSettingsIntent.putExtra("btcontroller", dev.getAddress());
    startActivityForResult(btSettingsIntent, 1);
    

    The tricky part was looking for the best position to call the pairing process. Using only the

    intent.putExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT, PAIRING_VARIANT_PIN);
    

    led me to a paring dialog that once closed left me with the device paired, but unusable.

    Digging into the classes of com.Android.settings.Bluetooth I found my way through the

    createDevicePreference(CachedBluetoothDevice cachedDevice) 
    

    in the DeviceListPreferenceFragment.

    From there I did compare my previously selected BT address with those available coming up and once successfully matched I call

    cachedDevice.startPairing();
    

    I know, it's tricky and requires access to the Android source code, but in a custom environment it works.

    I hope this could be helpful.

提交回复
热议问题