【问题标题】:Android Bluetooth LE Scanner only scans when phone's Location is turned on in some devicesAndroid 蓝牙 LE 扫描仪仅在某些设备中打开手机位置时进行扫描
【发布时间】:2020-04-19 16:23:21
【问题描述】:

我正在构建一个 Android 应用程序,它可以宣传小包信息并使用 BLE 扫描信息。 广告代码为:

   AdvertiseSettings advSettings = new AdvertiseSettings.Builder()
                .setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_BALANCED)
                .setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_MEDIUM)
                .setConnectable(false)
                .build();


        AdvertiseData advData = new AdvertiseData.Builder()
                .setIncludeTxPowerLevel(true)
                .addServiceUuid(uuid)
                .build();

        AdvertiseData advScanResponse = new AdvertiseData.Builder()
                .setIncludeDeviceName(false)
                .addServiceData(uuid,"1234567890".getBytes( Charset.forName( "UTF-8" ) ))
                .build();

        AdvertiseCallback advCallback = new AdvertiseCallback() {
            String TAG="status";

            @Override
            public void onStartFailure(int errorCode) {
                super.onStartFailure(errorCode);
                Log.e(TAG, "Not broadcasting: " + errorCode);
                int statusText;
                switch (errorCode) {
                    case ADVERTISE_FAILED_ALREADY_STARTED:
                        Log.w(TAG, "ADVERTISE_FAILED_ALREADY_STARTED");
                        break;
                    case ADVERTISE_FAILED_DATA_TOO_LARGE:
                        Log.w(TAG, "ADVERTISE_FAILED_DATA_TOO_LARGE");
                        break;
                    case ADVERTISE_FAILED_FEATURE_UNSUPPORTED:
                        Log.w(TAG, "ADVERTISE_FAILED_FEATURE_UNSUPPORTED");
                        break;
                    case ADVERTISE_FAILED_INTERNAL_ERROR:
                        Log.w(TAG, "ADVERTISE_FAILED_INTERNAL_ERROR");
                        break;
                    case ADVERTISE_FAILED_TOO_MANY_ADVERTISERS:
                        Log.w(TAG, "ADVERTISE_FAILED_TOO_MANY_ADVERTISERS");
                        break;
                    default:
                        Log.wtf(TAG, "Unhandled error: " + errorCode);
                }
                Toast.makeText(MainActivity.this, "Failed", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onStartSuccess(AdvertiseSettings settingsInEffect) {
                super.onStartSuccess(settingsInEffect);
                Log.v(TAG, "Advertising started");
                mText.setText(uuid.toString());
                Toast.makeText(MainActivity.this, "Started", Toast.LENGTH_SHORT).show();
            }
        };

        mBluetoothAdapter.getBluetoothLeAdvertiser()
                .startAdvertising(advSettings, advData, advScanResponse, advCallback);

监听的代码如下:

mBluetoothLeScanner=mBluetoothAdapter.getBluetoothLeScanner();


    ScanCallback mScanCallback = new ScanCallback() {
        @Override
        public void onScanResult(int callbackType, ScanResult result) {
            super.onScanResult(callbackType, result);
            if( result == null
                    || result.getDevice() == null
                     )
                return;

            if(result.getScanRecord().getServiceUuids()!=null) {

                ParcelUuid pp=result.getScanRecord().getServiceUuids().get(0);

                StringBuilder builder = new StringBuilder((pp.toString()+"\n"));

                builder.append(new String (result.getScanRecord().getServiceUuids().size()+""));

                mText.setText(builder.toString());
            }

我已经在多部手机上进行了测试,效果很好。但是,除非打开位置,否则 Galaxy S8+ 上的 Android 9.0 版无法扫描。我还在 Redmi Note 7 上尝试了 Android 9.0 版本,它无需打开位置即可完美运行。是什么导致了我的问题?

【问题讨论】:

  • 与 Pixel 手机相同。我想这是设计使然。否则,您可以向 Google 寻求答案。

标签: java android bluetooth-lowenergy


【解决方案1】:

不确定 Redmi Note 7 上的 Android 设置,但对于 Android 9 设备,需要打开 ACCESS_COARSE_LOCATION 才能使蓝牙正常工作。也许这在 Redmi Note 7 上以某种方式打开,无论位置设置如何,而在 S8+ 上,这与位置设置相关。

您可以在这里找到更多信息:-

https://stackoverflow.com/a/58232014/2215147

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 2016-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-08
    相关资源
    最近更新 更多