web-dev-qa-db-fra.com

remplacement de startLeScan de l'API actuelle

L'objectif est de lire les valeurs d'un moniteur de fréquence cardiaque Bluetooth LE.

En utilisant l'exemple de google, je reçois

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);
    }
}

qui cause mBluetoothAdapter.stopLeScan à afficher comme obsolète. Startscan n'est cependant pas une méthode de mBluetoothAdapter.

Comment changer cela pour qu'il fonctionne avec l'API actuelle?

25
Vitalis Hommel

Les deux méthodes BluetoothAdapter.startLeScan et BluetoothAdapter.stopLeScan étaient déconseillées dans Android Lollipop. En remplacement BluetoothLeScanner étaient introduit et agissant comme un contrôleur de numérisation.

Si vous développez une application basée sur BLE, vous devez contrôler la numérisation via BluetoothAdapter (Android 4.3 et Android 4.4) ou BluetoothLeScanner. L'API introduite dans Android Lollipop offre des fonctionnalités beaucoup plus importantes en termes de consommation d'énergie de la batterie.

21
dawid gdanski

Merci à tous pour vos réponses. Pour résumer la réponse à cette question, je vais ajouter mon extrait de code final.

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);
    }
}
16
Pedro Varela

Utilisez BluetoothAdapter.getBluetoothLeScanner() pour obtenir une instance de BluetoothLeScanner.

Ensuite, vous pouvez démarrer ou arrêter une analyse avec les méthodes startScan ou stopScan, un peu comme la version déconseillée.

La différence est que vous pouvez transmettre des filtres de numérisation et des paramètres. Le ScanCallback contient plus d'informations sur les appareils trouvés. Les filtres vous permettent de filtrer les résultats de l'analyse en fonction du nom, de l'adresse MAC, des UUID de service, etc. Les paramètres de numérisation vous permettent de contrôler la puissance de numérisation.

7
JPS

N'oubliez pas que la méthode:

public BluetoothLeScanner getBluetoothLeScanner ()

n'est pas statique. Si tu fais:

BluetoothAdapter.getBluetoothLeScanner() 

vous obtiendrez une erreur, car getDefaultAdapter () est une méthode statique, contrairement à getBluetoothLeScanner ().

Vous avez besoin d'une instance d'un BluetoothAdapter. Vous pouvez en obtenir un en faisant:

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

De cette façon, vous pouvez essayer:

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

mLeScanner.startScan(...);

Plus d'informations ici: http://developer.Android.com/reference/Android/bluetooth/BluetoothAdapter.html

5
andremd

Pour éviter l'avertissement. Vérifiez simplement la version de l'API avant d'appeler la fonction. Vous pouvez utiliser le code

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);
        }
3
Jame