Intereting Posts
Подключение к меню контактов android Почему я должен использовать пользовательский контент-провайдер в Android? Как получить long & lat значение четырех углов в mapview в android? Не удалось создать сообщение об ошибке класса BuildConfig в eclipse Вы посоветуете новичкам использовать Android Studio? Android google maps async задает добавить маркеры Получение скрытой строки состояния / ввод события полноэкранного события в службе Используйте команду adb screenrecord для отображения экрана Android на ПК через USB Нужно ли конкретным образом специфицировать его компоненты пользовательского интерфейса (Spinner, EditText) при использовании AppCompat Как сделать подсказку EditText не для переноса? Выбор номера диалогового окна Android Как удалить разделительную линию в прядильщике? Как использовать аннотации Android и его обработчик аннотации с гнездом? Оверлейная панель Android вне / между границами макета Виджет SearchView не отображается в панели действий

Диалоговое окно «Спаривание 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 на / системном разделе, чтобы отключить диалог. Возможно, вам также понадобится работать как системное приложение, но я думаю, скорее всего, нет.