目標は、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で動作するようにこれを変更するにはどうすればよいですか?
両方のメソッド BluetoothAdapter.startLeScan および BluetoothAdapter.stopLeScan は、Android Lollipop。代替品として BluetoothLeScanner で廃止されました導入され、スキャンコントローラーとして機能します。
BLEベースのアプリケーションを開発する場合は、BluetoothAdapter(Android 4.3およびAndroid 4.4)またはBluetoothLeScannerを使用してスキャンを制御する必要があります。Android Lollipopで導入されたAPIバッテリー消費電力の面ではるかに優れた機能を提供します。
ご回答ありがとうございました。この質問に対する答えを要約するために、最終的なコードスニペットを追加します。
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);
}
}
BluetoothAdapter.getBluetoothLeScanner()
を使用して、BluetoothLeScannerのインスタンスを取得します。
次に、非推奨バージョンと同様に、startScan
メソッドまたはstopScan
メソッドを使用してスキャンを開始または停止できます。
違いは、スキャンフィルターと設定を渡すことができることです。 ScanCallbackには、見つかったデバイスに関する詳細情報があります。フィルタを使用すると、名前、macaddress、サービスUUIDなどに基づいてスキャン結果をフィルタリングできます。スキャン設定を使用すると、スキャンの電力を制御できます。
メソッドは次のことに注意してください。
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
警告を回避するため。関数を呼び出す前に、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);
}