Запуск startLeScan в текущий api - программирование

Запуск startLeScan в текущий api

Цель состоит в том, чтобы прочитать значения монитора частоты сердечных сокращений bluetooth LE.

Используя образец Google, я получаю

private void scanLeDevice(final boolean enable) {
    if (enable) {
        // Stops scanning after a pre-defined scan period.
        mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                mScanning = false;
                mBluetoothAdapter.stopLeScan(mLeScanCallback);
            }
        }, SCAN_PERIOD);

        mScanning = true;
        mBluetoothAdapter.startLeScan(mLeScanCallback);
    } else {
        mScanning = false;
        mBluetoothAdapter.stopLeScan(mLeScanCallback);
    }
}

который вызывает отображение mBluetoothAdapter.stopLeScan как устаревшего. Startscan - это не метод mBluetoothAdapter, хотя.

Как изменить это для работы с текущим API?

4b9b3361

Ответ 1

Оба метода BluetoothAdapter.startLeScan и BluetoothAdapter.stopLeScan устарели в Android Lollipop. В качестве замены BluetoothLeScanner были введены и действуют как контроллер сканирования.

Если вы разрабатываете приложение на основе BLE, вы должны контролировать сканирование через BluetoothAdapter (Android 4.3 и Android 4.4) или BluetoothLeScanner. API, представленный в Android Lollipop, предлагает гораздо большие возможности с точки зрения потребления энергии аккумулятора.

Ответ 2

Спасибо всем за ваши ответы. Чтобы суммировать ответ на этот вопрос, я добавлю свой окончательный фрагмент кода.

private BluetoothAdapter mBluetoothAdapter;


private ScanCallback mLeScanCallback = new ScanCallback() {
    @Override
    public void onScanResult(int callbackType, ScanResult result) {
        super.onScanResult(callbackType, result);
    }

    @Override
    public void onBatchScanResults(List<ScanResult> results) {
        super.onBatchScanResults(results);
    }

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

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    BluetoothManager bluetoothManager = (BluetoothManager) getActivity().getSystemService(Context.BLUETOOTH_SERVICE);
    mBluetoothAdapter = bluetoothManager.getAdapter();
}


private void scanLeDevice(final boolean enable) {

    final BluetoothLeScanner bluetoothLeScanner = mBluetoothAdapter.getBluetoothLeScanner();

    if (enable) {
        // Stops scanning after a pre-defined scan period.
        mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                mScanning = false;

                bluetoothLeScanner.stopScan(mLeScanCallback);
            }
        }, SCAN_PERIOD);

        mScanning = true;
        bluetoothLeScanner.startScan(mLeScanCallback);
    } else {
        mScanning = false;
        bluetoothLeScanner.stopScan(mLeScanCallback);
    }
}

Ответ 3

Используйте BluetoothAdapter.getBluetoothLeScanner(), чтобы получить экземпляр BluetoothLeScanner.

Затем вы можете запустить или остановить сканирование с помощью методов startScan или stopScan, как и устаревшая версия.

Разница заключается в том, что вы можете передавать сканирующие фильтры и настройки. ScanCallback имеет больше информации о найденных устройствах. Фильтры позволяют фильтровать результаты сканирования на основе имени, macaddress, UUID службы и т.д. Параметры сканирования позволяют контролировать мощность сканирования.

Ответ 4

Помните, что метод:

public BluetoothLeScanner getBluetoothLeScanner ()

не является статическим. Если вы выполните:

BluetoothAdapter.getBluetoothLeScanner() 

вы получите сообщение об ошибке, так как getDefaultAdapter() является статическим методом, но getBluetoothLeScanner() - нет.

Вам нужен экземпляр BluetoothAdapter. Вы можете получить его, выполнив:

(BluetoothManager) mContext.getSystemService(Context.BLUETOOTH_SERVICE).getAdapter()

Таким образом, вы можете попробовать:

Context mContext = getBaseContext();
BluetoothAdapter mAdapter = ((BluetoothManager) mContext.getSystemService(Context.BLUETOOTH_SERVICE)).getAdapter();
BluetoothLeScanner mLeScanner = mAdapter.getBluetoothLeScanner();

mLeScanner.startScan(...);

Дополнительная информация здесь: http://developer.android.com/reference/android/bluetooth/BluetoothAdapter.html

Ответ 5

Чтобы избежать предупреждения. Просто проверьте версию API перед вызовом функции. Вы можете использовать код

private BluetoothAdapter bluetoothAdapter;
private BluetoothAdapter.LeScanCallback leScanCallback;
private BluetoothAdapter.LeScanCallback leScanCallback;
private ScanCallback scanCallback;
private ScanSettings scanSetting;

// Check before call the function
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            bluetoothAdapter.getBluetoothLeScanner().startScan(filterList, scanSetting, scanCallback);
        } else {
            bluetoothAdapter.startLeScan(leScanCallback);
        }