Мне удалось автоматически запросить процедуру сопряжения с устройствами с клавиатурой через приложение, работающее как служба, проверяющее наличие определенного типа устройства и измененную версию приложения Настройки.
Я должен сказать, что я работал на пользовательском устройстве под управлением Android 4.0.3 без внешних элементов управления (без кнопок назад / Домой / Подтвердить): подключение контроллера при загрузке завершено без какого-либо взаимодействия, пока запрос PIN-кода не станет обязательным.
Сначала я создал службу, запускающую действие при загрузке (с android.intent.action.BOOT_COMPLETED
и android.permission.RECEIVE_BOOT_COMPLETED)
, которая периодически проверяет наличие устройства класса 1344 (клавиатура, единственный способ ввода данных по запросу) в обратном вызове onReceive:
public void onReceive(Context context, Intent intent)
...
BluetoothDevice dev = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
...
if(dev.getBluetoothClass().getDeviceClass() == 1344){...}
После фильтрации я выбираю первую доступную клавиатуру, а затем передаю BT-адрес приложению «Настройки»:
Intent btSettingsIntent = new Intent(Settings.ACTION_BLUETOOTH_SETTINGS);
btSettingsIntent.putExtra("btcontroller", dev.getAddress());
startActivityForResult(btSettingsIntent, 1);
Хитрая часть искала лучшую позицию для вызова процесса сопряжения. Использование только
intent.putExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT, PAIRING_VARIANT_PIN);
привел меня к диалоговому окну очистки, которое когда-то закрылось, оставило меня с сопряженным устройством, но непригодным для использования.
Копаясь в классах com.Android.settings. Bluetooth Я нашел свой путь через
createDevicePreference(CachedBluetoothDevice cachedDevice)
в DeviceListPreferenceFragment.
Оттуда я сравнил свой ранее выбранный адрес BT с доступными, и после успешного сопоставления я звоню
cachedDevice.startPairing();
Я знаю, это сложно и требует доступа к исходному коду Android, но в пользовательской среде это работает.
Надеюсь, это может быть полезно.