如何修复Android BLE SCAN_FAILED_APPLICATION_REGISTRATION_FAILED错误?

时间:2016-02-13 06:02:44

标签: android bluetooth-lowenergy

大多数情况下它运行良好,但有时我在尝试发现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 个答案:

答案 0 :(得分: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" />

您必须为应用程序打开FINE LOCATION或COARSE 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。

答案 1 :(得分: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;

答案 2 :(得分:0)

理想情况下,请查看手机的位置服务支持(Android 6+ BLE服务需要打开才能正常使用)。我们在其他场合使用Cordova插件也看到了此问题。打开位置服务(或检查它们是否已打开)。

答案 3 :(得分: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会崩溃

答案 4 :(得分:0)

如果断开连接和/或重新连接,请确保关闭GattConnection。仅仅处理该对象并不会释放基础资源,并且据我所知,您很快就会达到极限,因为据我所知,所有应用程序中最多可以有32个并发客户端。