蓝牙扫描失败

7
我正在使用MI Note 4(Android 7.0)和Moto X Play(Android 7.1.1)。我正在一个单独的服务中进行BLE扫描。在扫描时,我得到了“扫描失败”的扫描响应。打开/关闭蓝牙不影响扫描响应。打开/关闭Wifi也不影响扫描响应。(但是,在这种情况下,Android内置(从设置->蓝牙)蓝牙扫描可以正常工作。)我还使用了BLE扫描应用程序,但该应用程序也无法检测到BLE广告!我尝试了打开/关闭飞行模式,我的设备能够成功扫描。扫描功能:
mLeScanner.startScan(filters, scanSettings, mScanCallback);

扫描回调:

ScanCallback() {
        @Override
        public void onScanResult(int callbackType, ScanResult result) {
               Log.e("TAG","onScanResult");
        }

        @Override
        public void onScanFailed(int errorCode) {
            super.onScanFailed(errorCode);
            Log.e("TAG","onScanFailed");
            }
        }

扫描设置:

   scanSettings = new ScanSettings.Builder()
                .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
                .build();

筛选器:

List<ScanFilter> filters = new ArrayList<>();
ScanFilter filter = new ScanFilter.Builder().setDeviceAddress("device address").build();
filters.add(filter);

信标扫描过滤器

ScanFilter.Builder builder = new ScanFilter.Builder();
      builder.setManufacturerData(0x004c, new byte[]{}); 

有人知道为什么只有切换飞行模式才能使其工作吗?

网络会影响BLE扫描吗?


你能分享一下BLE扫描类吗? - Nithinjith
@Nithinjith 更新所需代码。 - Parth
你在onScanFailed()中是否收到了任何特定的错误代码?如果是,请分享一下。此外,您正在传递特定的设备地址。是否可能进行基于服务的扫描(检查设备中是否有特定服务可用)?还有一件事是,ScanSettings.SCAN_MODE_LOW_LATENCY仅适用于前台。 - Nithinjith
onScanFailed() 的错误代码是2,我只使用了 beacon 进行过滤(已在问题中更新),但无法获得成功的结果。我也在前台进行扫描。 - Parth
2个回答

1
错误代码0x02表示SCAN_FAILED_APPLICATION_REGISTRATION_FAILED(无法启动扫描,因为应用程序无法注册)。这意味着,在进行扫描之前,我们需要初始化蓝牙适配器。
 /**
     * Initialize BluetoothAdapter
     * Check the device has the hardware feature BLE
     * Then enable the hardware,
     */
    public boolean init(Context context) {
        BluetoothManager bluetoothManager = (BluetoothManager) context.getSystemService(Context.BLUETOOTH_SERVICE);
        mBluetoothAdapter = bluetoothManager.getAdapter();

        return mBluetoothAdapter != null && context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE);
    }

然后注册接收器。
**
     * Register GATT update receiver
     */
    private void registerServiceReceiver() {
        this.registerReceiver(mGattUpdateReceiver, makeGattUpdateIntentFilter());
        registerReceiver(mReceiver, new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED));
    }

服务初始化方法也包含在答案中。服务创建是可选的。
  /**
     * Initialize Bluetooth service.
     */
    public void initBLEService(Context context) {
        try {
            this.mContext = context;

            if (mBLEService == null) {
                Intent gattServiceIntent = new Intent(mContext, BLEService.class);

                if (this.mContext != null) {
                    isBind = mContext.bindService(gattServiceIntent, mServiceConnection, mContext.BIND_AUTO_CREATE);
                }

            }

        } catch (Exception e) {
            AppLog.logError(TAG, e.getMessage());
        }
    }

我希望您已经在下面的清单中添加了许可。
<uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
 <uses-feature
        android:name="android.hardware.bluetooth_le"
        android:required="true" />

我希望这可以帮助你。

谢谢回答。但是我之前已经实现了相同的内容。在服务创建时,我调用了init()方法。接收蓝牙状态改变的接收器也已注册。在清单文件中也做了注册,同时已授予位置访问权限。并且相同的代码在许多设备上工作正常。 - Parth

0
我的问题在获取用户许可ACCESS_COARSE_LOCATION后得到了解决。您可以在onStart()中请求用户权限。
Java语法
if (ContextCompat.checkSelfPermission(this, ACCESS_COARSE_LOCATION)
        != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(
        this,
        new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
        PERMISSIONS_REQUEST_LOCATION);
}

Kotlin语法

if (ContextCompat.checkSelfPermission(this, ACCESS_COARSE_LOCATION)
        != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(
        this,
        arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION),
        PERMISSIONS_REQUEST_LOCATION)
}

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