天天看点

Android各版本BLE处理方案(Update on 2021-01-05)Android BLE 处理方案

Android BLE 处理方案

前言

此文档记录Android系统中,BLE在各个Android系统版本会出现的问题以及建议的处理方案,非最优解决方案。

Update on 2021-01-05

29 (10.0)

1、华为和其他一部分手机在Android系统10.0的时候,如果设备广播间隔稍微长了一些,可能就会出现扫描不到设备的问题,处理的方案为改为批量回调筛选设备,该方案针对扫描特定型号设备时比较好使,如果换成其他手机,还是改回单个回调的方法较优。

ScanSettings.Builder builder = new ScanSettings.Builder()
                .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY);
//改动这个值,改为不为0,即可开启批量回调,这时候单个回调方法不执行,单位毫秒
builder.setReportDelay(600);

private ScanCallback mScanCallback = new ScanCallback() {
        @Override
        public void onScanResult(int callbackType, final ScanResult result) {
			//系统单个回调方法
        }

        @Override
        public void onBatchScanResults(List<ScanResult> results) {
            super.onBatchScanResults(results);
    		//批量回调方法
        }

        @Override
        public void onScanFailed(int errorCode) {
            super.onScanFailed(errorCode);
        }
    };
           

28(9.0)

1、息屏扫描问题解决方案,三星、华为等手机在Android系统大于9.0的时候,通过8.1的方案处理还是出现了息屏无法进行扫描的问题,需要通过过滤配置来解决,添加了过滤条件后,如以下操作,在息屏状态下,系统也会回调EddyStone和ibeacon的设备数据到APP里,该方案只能解决扫描配置过的设备,无法扫描没有配置过的设备类型;

//添加EddyStone的过滤条件
scanFilter.add(new ScanFilter.Builder()
          .setServiceUuid(ParcelUuid.fromString("0000feaa-0000-1000-8000-00805f9b34fb"))
          .build());
//添加ibeacon 的过滤条件
scanFilter.add(new ScanFilter.Builder()
          .setManufacturerData(0x004c, new byte[]{})
          .build());
scanner.startScan(scanFilter, scanSettings, mScanCallback);
           

27(8.1)

1、Android 8.1系统,在屏幕关闭之后,扫描会被暂停,如果需要在屏幕被关闭之后还继续进行扫描的话,需要在扫描配置那里,加入一个空的过滤器,如下:

26(8.0)

新的设备配套方法,支持BLE,未测试过,https://developer.android.com/guide/topics/connectivity/companion-device-pairing,Android官网,需梯子;

25(7.1.1)

24(7.0)

Android 7.0系统限制在30s内最多启动扫描5次。其实,只要在30s内不要连续调用stopScan这个方法,连续调用startScan这个方法很多次都不会存在问题,会持续返回扫描到的设备数据;

23(6.0)

1、扫描功能需要申请位置权限;部分机型在申请了位置权限之后还是无法扫描到设备,可能是由于系统设置中的定位服务需要开启的关系;

2、对蓝牙的连接,读写,广播等操作,需要申请蓝牙管理权限(android.permission.BLUETOOTH_ADMIN);

22(5.1)

21(5.0)

1、蓝牙 startScan 分了低版本(5.0之下)和高版本(5.0以上)的api,低版本中建议startLeScan不要传递uuid,高版本中建议不要用到onBatchScanResults的方式。

2、支持作为从端进行广播,但是不一定所有5.0+的手机都支持作为从端,部分手机不支持,需要用方法进行判断是否支持,如下:(BluetoothAdapter.class)

/**
     * Returns a {@link BluetoothLeAdvertiser} object for Bluetooth LE Advertising operations.
     * Will return null if Bluetooth is turned off or if Bluetooth LE Advertising is not
     * supported on this device.
     * <p>
     * Use {@link #isMultipleAdvertisementSupported()} to check whether LE Advertising is supported
     * on this device before calling this method.
     */
    public BluetoothLeAdvertiser getBluetoothLeAdvertiser() {
        if (!getLeAccess()) {
            return null;
        }
        synchronized (mLock) {
            if (sBluetoothLeAdvertiser == null) {
                sBluetoothLeAdvertiser = new BluetoothLeAdvertiser(mManagerService);
            }
        }
        return sBluetoothLeAdvertiser;
    }
           

还有作为从端进行广播的时候,如果被连接后,会马上启动一个新的广播,并且新的广播会携带一个新的mac地址,之前的连接没断,如果新的mac地址被连接了,之前的连接会断开,并且又新启动一个新的广播,新的mac地址;

18(4.3)

Android 4.3之后,开始支持BLE低功耗蓝牙;