Решение для сканирования BLE SCAN_FAILED_APPLICATION_REGISTRATION_FAILED?

Мое приложение для Android сканирует устройства BLE и с определенной точки начинает сбой с кодом ошибки 2 (ScanCallback.SCAN_FAILED_APPLICATION_REGISTRATION_FAILED). Я использую Nexus 9, 5.0.1 Lollipop.

Эта проблема продолжалась даже после того, как я перезапустил приложение, и когда я перезапустил службу Bluetooth из настроек, я мог бы, наконец, избавиться от этой проблемы. Но эта проблема повторяется, и я думаю, что я неправильно кодирую; Связанные с BLE API-интерфейсы являются новыми, и информации немного.

Кто-нибудь знает общее решение этой ошибки, желательно, не требуя перезапуска службы Bluetooth? Несмотря на то, что этот код ошибки документирован в справочной системе Android API, я не знаю, как правильно его обрабатывать.

Ответ 1

Когда вы получили сообщение об ошибке

SCAN_FAILED_APPLICATION_REGISTRATION_FAILED

Вы должны отключить BluetoothAdapter

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

Вы должны выполнить операции только с успешной инициализацией адаптера BT. Чтобы убедиться, что он готов, создайте фильтр цели:

val filter = IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED)

и широковещательный приемник (вы будете выполнять действие только в том случае, если адаптер готов):

val broadcastReceiver = object: BroadcastReceiver() {
            override fun onReceive(context: Context, intent: Intent?) {
                val action = intent?.action
                if (action != null && action == BluetoothAdapter.ACTION_STATE_CHANGED) {
                    val state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR)
                    when (state) {
                        BluetoothAdapter.STATE_ON -> {
                            if (bluetoothAdapter.isEnabled) {
                               //perform your task here
                            }
                        }
                        BluetoothAdapter.STATE_OFF -> {}
                    }
                }
            }
        }

затем зарегистрируйте приемник:

registerReceiver(broadcastReceiver, filter)

и перезапустить адаптер (эта часть может заменяться с помощью):

bluetoothAdapter.disable()
bluetoothAdapter.enable()

СДЕЛАНО!

Ответ 3

Оказывается, для Bluetooth LE требуются следующие разрешения приложений Android в AndroidManifest.xml:

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

<!--BLE scanning is commonly used to determine a user location with Bluetooth LE beacons. -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<!-- if your app targets API level 21 or higher. -->
<uses-feature android:name="android.hardware.location.gps" />

<!--app is available to BLE-capable devices only. -->
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>

Кроме того, по основной деятельности:

// onResume()
if (ContextCompat.checkSelfPermission(this.getApplicationContext(),
        android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
} else {
    ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION},
            REQUEST_LOCATION_ENABLE_CODE);
}

Ответ 4

Это случилось со мной сегодня. Хотя ручное отключение и последующее включение BT в настройках Android не устранило это, я смог заставить его работать, только отключив его вручную, а затем включил приложение, на которое влияет проблема.

Затем приложение выдает системное сообщение Android "Приложение запрашивает разрешение на включение BT" (у меня немецкий интерфейс, так что он может быть сформулирован по-другому), и когда я нажимаю "Разрешить", приложение, наконец, имеет надлежащий доступ к BT. и эта ошибка больше не показывает.

Похоже, ошибка или что-то.