BLE扫描的解决方案SCAN_FAILED_APPLICATION_REGISTRATION_FAILED?

时间:2014-12-17 00:23:06

标签: bluetooth-lowenergy android-5.0-lollipop android-bluetooth

我的Android应用程序扫描BLE设备,从某一点开始,它开始失败,错误代码为2( ScanCallback.SCAN_FAILED_APPLICATION_REGISTRATION_FAILED )。我正在使用Nexus 9,5.0.1 Lollipop。

即使在重新启动应用程序后,此问题仍然存在,当我从“设置”重新启动蓝牙服务时,我终于可以解决问题了。但是这个问题反复发生,我认为我编码错误;与BLE相关的API是新的,信息很少。

有没有人知道此错误的一般解决方案,最好不要求重启蓝牙服务?即使Android API参考中记录了此错误代码,我也不知道如何正确处理它。

4 个答案:

答案 0 :(得分:5)

当你收到错误时

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;

答案 1 :(得分:1)

您应该仅执行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()

DONE!

答案 2 :(得分:0)

事实证明,蓝牙LE在AndroidManifest.xml中需要以下Android应用程序权限:

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

答案 3 :(得分:0)

我今天发生了这种情况。虽然在“ Android设置”中手动禁用然后启用BT并不能解决此问题,但我只能在手动禁用它之后再让受此问题影响的应用启用BT才能使其正常工作。

然后该应用程序弹出一条Android系统消息“一个应用程序正在请求打开BT的权限”(我有一个德语用户界面,因此其措词可能有所不同),然后按允许,该应用程序终于可以正常运行了。访问BT,此错误不再显示。

听起来像是虫子之类的东西。