大多数情况下它运行良好,但有时我在尝试发现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
它似乎是内部的android问题,但它可能会受到我的代码做错的影响。可能是什么原因以及如何解决它?
PS。 Nexus 9,Android 6.0.1
答案 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个并发客户端。