如何修复Android BLE SCAN_FAILED_APPLICATION_REGISTRATION_FAILED错误?

21

大多数情况下它工作得很好,但有时在尝试发现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


5个回答

2

我遇到了同样的问题,这个方法对我有效。可能看起来很傻,但是确实有效。

在您的清单文件中添加必需的蓝牙和位置权限要求后...

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

您必须为应用程序打开精细位置或粗略位置权限。您可以从设备上的应用程序设置手动执行此操作,也可以将此代码添加到onCreate()方法中。

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);
        }

您还需要将int REQUEST_LOCATION_ENABLE_CODE定义为1。

0
理想情况下,请查看手机的位置服务支持(Android 6+ BLE服务需要打开才能正常工作)。我们在其他Cordova插件中也遇到过这个问题。请打开位置服务(或检查是否已打开)。

0

如果您断开连接和/或重新连接,请确保关闭GattConnection。仅处理对象不会释放底层资源,您很快就会达到限制,因为据我了解,在所有应用程序中最多只有32个可能的同时客户端。


0
一个可能的解决方法是通过编程方式禁用/启用蓝牙。当您遇到SCAN_FAILED_APPLICATION_REGISTRATION_FAILED错误时,应该禁用BluetoothAdapter:
BluetoothAdapter.getDefaultAdapter().disable();

禁用BluetoothAdapter后,将触发STATE_TURNING_OFF事件。一旦触发此事件,请尝试重新连接到BluetoothAdapter:

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;

不幸的是,这似乎无法解决问题。我在Android 6.0.1和7.1上都遇到了同样的问题。我的应用程序长时间进行连续扫描;这在一周内仅发生了两次。从设置应用程序中切换蓝牙适配器也无法解决问题,但有趣的是,设置应用程序仍然可以执行对周围外设的蓝牙扫描,但所有进行扫描的第三方应用程序都会收到此错误代码“SCAN_FAILED_APPLICATION_REGISTRATION_FAILED”。 - Chee-Yi
2
请随意将问题标记为重复,而不是在多个地方发布相同的答案。 - tir38

0

您需要在清单文件中添加以下权限:

<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中断。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接