Диалоговое окно «Спаривание Bluetooth»

Я разрабатываю внутреннее приложение, использующее Bluetooth для печати. Я хочу, чтобы сопряжение Bluetooth происходило без ввода пользователем. Мне удалось добиться этого, захватив передачу android.bluetooth.device.action.PAIRING_REQUEST .

В моем широковещательном приемнике я вызываю метод setPin, и соединение работает нормально, но BluetoothPairingDialog отображается на секунду или два, затем он исчезает – см. Ссылку ниже.

https://github.com/android/platform_packages_apps_settings/blob/master/src/com/android/settings/bluetooth/BluetoothPairingDialog.java

Поскольку широковещательная передача не упорядочена, я не могу вызвать abortBroadcast() , и мне было интересно, есть ли другой способ предотвратить появление диалога спаривания. Можно ли каким-то образом подключиться к оконному менеджеру?

Я, честно говоря, не смог придумать способ сделать это без изменения sdk. Если вы OEM, это легко (я на 4.3):

В пакетах / приложениях / настройках / AndroidManifest.xml прокомментируйте фильтр намерений для диалога сопряжения:

 <activity android:name=".bluetooth.BluetoothPairingDialog" android:label="@string/bluetooth_pairing_request" android:excludeFromRecents="true" android:theme="@*android:style/Theme.Holo.Dialog.Alert"> <!-- <intent-filter> <action android:name="android.bluetooth.device.action.PAIRING_REQUEST" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> --> </activity> 

В рамках / base / core / java / android / bluetooth / BluetoothDevice.java удалите аннотацию @hide javadoc из этой константы

 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public static final String ACTION_PAIRING_REQUEST = "android.bluetooth.device.action.PAIRING_REQUEST"; 

И этот метод

 public boolean setPairingConfirmation(boolean confirm) 

Затем зарегистрируйте свою собственную деятельность или широковещательный приемник для действия BluetoothDevice.PAIRING_REQUEST. Этот широковещательный приемник позволяет спариваться, продолжая без ввода пользователя (только если не требуется ни один контакт):

 @Override public void onReceive(Context context, Intent intent) { if( intent.getAction().equals(BluetoothDevice.ACTION_PAIRING_REQUEST) ) { BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); device.setPairingConfirmation( true ); } } 

Вам нужно будет перестроить sdk и скомпилировать ваш код с новой версией, чтобы получить доступ к константе и методам, и замените Settings.apk на / системном разделе, чтобы отключить диалог. Возможно, вам также понадобится работать как системное приложение, но я думаю, скорее всего, нет.