Как исправить ошибку Android BLE SCAN_FAILED_APPLICATION_REGISTRATION_FAILED?

В большинстве случаев это прекрасно работает, но иногда у меня возникает эта ошибка при попытке обнаружить устройства BLE:

02-12 18:00:41.952  16178-16339/com.icrealtime.allie W/BleRpcConnectionFactory﹕ Starting discovery
02-12 18:00:41.955  16178-16339/com.icrealtime.allie D/BluetoothAdapter﹕ STATE_ON
02-12 18:00:41.957  24342-18813/? D/BtGatt.GattService﹕ registerClient() - UUID=c4a4c56d-1d10-4615-9c8d-44971bc3d6e6
02-12 18:00:41.957  24342-24384/? E/bt_btif﹕ Register with GATT stack failed.
02-12 18:00:41.957  24342-24384/? E/bt_btif﹕ Register with GATT stack failed.
02-12 18:00:41.957  24342-24370/? D/BtGatt.GattService﹕ onClientRegistered() - UUID=c4a4c56d-1d10-4615-9c8d-44971bc3d6e6, clientIf=0
02-12 18:00:41.958  16178-16190/com.icrealtime.allie D/BluetoothLeScanner﹕ onClientRegistered() - status=133 clientIf=0
02-12 18:00:41.967  16178-16178/com.icrealtime.allie E/BleRpcConnectionFactory﹕ BLE SCAN FAILED: 2

код ошибки 2 означает https://developer.android.com/reference/android/bluetooth/le/ScanCallback.html#SCAN_FAILED_APPLICATION_REGISTRATION_FAILED

Кажется, это внутренняя проблема с Android, но мой код может что-то сделать неправильно. В чем может быть причина и как обойти это?

PS. Nexus 9, Android 6.0.1

Ответ 1

Возможным обходным решением может быть отключение/включение программного обеспечения Bluetooth. Когда вы получили сообщение об ошибке SCAN_FAILED_APPLICATION_REGISTRATION_FAILED, вы должны отключить адаптер Bluetooth:

BluetoothAdapter.getDefaultAdapter().disable();

Отключение BluetoothAdapter, событие STATE_TURNING_OFF. Как только это событие будет запущено, попробуйте подключиться к адаптеру Bluetooth:

case BluetoothAdapter.STATE_OFF:
  Log.d(TAG, "bluetooth adapter turned off");
  handler.postDelayed(new Runnable() {
    @Override
    public void run() {
        Log.d(TAG, "bluetooth adapter try to enable");
        BluetoothAdapter.getDefaultAdapter().enable();
    }}, 500);
  break;

Ответ 2

В идеале, пожалуйста, обратитесь в службу поддержки определения местоположения телефона (службы Android 6+ BLE требуют, чтобы она была включена для правильной работы). Мы видели эту проблему в других случаях с плагинами Cordova. Включите службы определения местоположения (или убедитесь, что они включены).

Ответ 3

вам нужно добавить следующее разрешение в манифесте:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-feature android:name="android.hardware.location.network"/>

В противном случае грубое местоположение не сможет получить доступ к сети, и поэтому LeScan распадется