Подтвердить что ты не робот

Android Запретить диалог Bluetooth-сопряжения

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

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

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

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

4b9b3361

Ответ 1

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