当前位置: 首页 > 知识库问答 >
问题:

尝试检测BLE设备时未调用onLeScan函数

何琨
2023-03-14

我正在尝试在服务上检测附近的蓝牙低功耗设备。当服务启动时,会调用starLeScan(),然后在10秒后调用Stop LeScan()。即使start LeScan()返回true,并且我没有得到任何错误,LeScanCallback上的onLeScan也没有被调用。服务:

    .
    .
    .
            // Device scan callback.
        private BluetoothAdapter.LeScanCallback mLeScanCallback =
                new BluetoothAdapter.LeScanCallback() {

                    public void onLeScan(final BluetoothDevice device, final int rssi, final byte[] scanRecord) {
                        Log.i(TAG, "New LE Device: " + device.getName() + " @ " + rssi);
                        if (DEVICE_NAME.equals(device.getName()) && deviceAddress.equals(device.getAddress())) {
                            mDevice = device;
                            BleScan(false);
                            connectBluetoothDevice();
                        }
                    }
                };

    /**
     * Starts and stops Bluetooth LE scanning for BLE devices.
     *
     * @param enable true to start scanning, false to stop scanning.
     */
    public void scanLeDevice(final boolean enable) {
        if (enable) {
            // Stops scanning after a pre-defined scan period.
            mHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    if (mScanning) {
                        BleScan(false);
                    }
                }
            }, SCAN_PERIOD);
            BleScan(true);
        } else {
            BleScan(false);
        }

    }

    /**
     * @param scan true to scan, and false to stop scanning for Bluetooth LE devices.
     */
    private void BleScan(boolean scan) {
        if (scan) {
            mScanning = true;
            boolean temp = mBluetoothAdapter.startLeScan(mLeScanCallback);
            Log.i(TAG, "Started LE scan: " + temp);
        } else {
            mScanning = false;
            mBluetoothAdapter.stopLeScan(mLeScanCallback);
        }
    }

我尝试使用BluetoothLeScanner startScan()和stopScan(),并改用ScanCallback,但没有任何帮助:

    ScanCallback mScanCallback = new ScanCallback() {
        @Override
        public void onScanResult(int callbackType, ScanResult result) {
            Log.i(TAG, "New LE Device: " + result.getDevice().getName() + " @ " + result.getRssi());
        }

        @Override
        public void onScanFailed(int errorCode) {
            Log.i(TAG, "Scan Faild!!");
        }
    };


    /**
     * Starts and stops Bluetooth LE scanning for BLE devices.
     *
     * @param enable true to start scanning, false to stop scanning.
     */
    public void scanLeDevice(final boolean enable) {
        if (enable) {
            // Stops scanning after a pre-defined scan period.
            mHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    if (mScanning) {
                        BleScan(false);
                    }
                }
            }, SCAN_PERIOD);
            BleScan(true);
        } else {
            BleScan(false);
        }

    }

    /**
     * @param scan true to scan, and false to stop scanning for Bluetooth LE devices.
     */
    private void BleScan(boolean scan) {
        if (scan) {
            mScanning = true;
            mBluetoothLeScanner.startScan(mScanCallback);
            Log.i(TAG, "Started LE scan");
        } else {
            mScanning = false;
            mBluetoothLeScanner.stopScan(mScanCallback);
        }
    }

有人说需要打开GPS,所以我打开了GPS。我试着重新启动android设备。另一个BLE检测应用程序可以看到BLE设备。

为什么没有调用扫描回调?

编辑

我在运行Android6.0.1的nexus 5设备上运行这个应用程序。

我尝试添加位置权限,但没有帮助:

( uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" )

共有3个答案

李联
2023-03-14

接下来是谷歌文档:

1.将这些行添加到清单中

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

<!-- Required only if your app isn't using the Device Companion Manager. -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

2.设置ble前检查权限ACCESS_FINE_LOCATION

private void checkPermission() {
    String[] permissions = {Manifest.permission.ACCESS_FINE_LOCATION};
    if (checkSelfPermission(permissions[0]) != PackageManager.PERMISSION_GRANTED) {
        requestPermissions(permissions, REQUEST_ENABLE_LOCATION);
    }
}
裴浩歌
2023-03-14

尝试在应用程序设置(settings)中打开对位置数据的访问-

颜高格
2023-03-14

我有类似的问题。相同的代码,一个平板电脑不工作,但其他的。我没有解决方案,但当我重置我的平板电脑并重新安装apk时,它可以再次正常工作。

我在BluetoothAdapter上找到了这个。LeScanCallback没有在AndroidMarshmallow中调用当我打开gps时,这是工作。。。

 类似资料:
  • 我有3台Android设备,三星Galaxy S3手机,三星Tab4和Verizon OEM平板电脑。Verizon OEM平板电脑不支持BLE、API 17。我从android开发者网站安装了“BLE设备扫描”,并在Galaxy S3上运行。它只显示Verizon平板电脑是找到的设备。当我在三星Tab4上运行相同的应用程序时,它只显示Galaxy S3作为找到的设备。如果我只看Galaxy S3

  • 我使用LeScanCallback(无法使用更新的扫描方法,因为我正在为api 18开发。这并不重要,因为android 5.0 api也不提供此功能)来检测何时检测到附近的BLE设备: 我没有与设备配对或连接,因为这不是必需的,我只是想看看附近有哪些设备。 我正在尝试创建一个服务,每隔5分钟左右,调用一个Web服务器来更新此时附近的设备。 棘手的是android设备将移动,所以现在附近的蓝牙设备

  • 我正在创建一个Android应用程序,该应用程序使用Android Studio扫描所有附近的BLE(蓝牙低功耗)设备。 我想我已经实施了所有这些文件: https://developer.android.com/guide/topics/connectivity/bluetooth/ble-overview https://developer.android.com/guide/topics/c

  • 我正在尝试在Sony SmartWatch 3上实现BluetoothGattServer。 我可以成功地打开Gatt服务器并做广告。 使用BLE扫描仪应用程序,我在发现我的自定义服务及其自定义特征时得到不一致的结果。 在三星Galaxy Note 8-Android 4.4-上,我可以正确检测自定义服务和自定义特性 这是我在Wear设备上运行的代码: 我还尝试使用自定义生成的UUID从https

  • 短版本: 在我对Android 5.0Lollipop的测试中,我注意到了Android.bluetooth.le。BluetoothLeScanner检测BLE设备的频率低于Android 4.4 KitKat。为什么会这样?还有其他选择吗? 长版本: 我正在开发一个Android应用程序,专门为Nexus 7平板电脑开发,该应用程序专注于检测蓝牙低能耗(BLE)设备。该应用程序主要关注信标的R

  • 1.1.1. 开发调试 1.1.1. 开发调试 这里主要介绍如何进行调试开发板,如系统登录,串口登录,日志查看等 系统登录 串口登录(插上 Debug 板上typec 线,此时必须先插上供电口 typec 线) 插上 Debug 板 typec 线,接上串口后,输入用户名:root,密码无,即可登录系统 adb 登录(插上开发板电源供电口typec线) 通过命令 adb shell 即可登录 (如