web-dev-qa-db-ja.com

現在のAPIへのstartLeScanの置き換え

目標は、Bluetooth LE心拍数モニターの値を読み取ることです。

グーグルのサンプルを使用して、私は得る

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で動作するようにこれを変更するにはどうすればよいですか?

25
Vitalis Hommel

両方のメソッド BluetoothAdapter.startLeScan および BluetoothAdapter.stopLeScan は、Android Lollipop。代替品として BluetoothLeScanner で廃止されました導入され、スキャンコントローラーとして機能します。

BLEベースのアプリケーションを開発する場合は、BluetoothAdapter(Android 4.3およびAndroid 4.4)またはBluetoothLeScannerを使用してスキャンを制御する必要があります。Android Lollipopで導入されたAPIバッテリー消費電力の面ではるかに優れた機能を提供します。

21
dawid gdanski

ご回答ありがとうございました。この質問に対する答えを要約するために、最終的なコードスニペットを追加します。

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

BluetoothAdapter.getBluetoothLeScanner()を使用して、BluetoothLeScannerのインスタンスを取得します。

次に、非推奨バージョンと同様に、startScanメソッドまたはstopScanメソッドを使用してスキャンを開始または停止できます。

違いは、スキャンフィルターと設定を渡すことができることです。 ScanCallbackには、見つかったデバイスに関する詳細情報があります。フィルタを使用すると、名前、macaddress、サービスUUIDなどに基づいてスキャン結果をフィルタリングできます。スキャン設定を使用すると、スキャンの電力を制御できます。

7
JPS

メソッドは次のことに注意してください。

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
andremd

警告を回避するため。関数を呼び出す前に、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);
        }
3
Jame