ref_
Scanning and GATT Connection
/**
* Stops scanning after 20 seconds.
*/
private static final long SCAN_PERIOD = 20000;
private BluetoothAdapter mBluetoothAdapter;
private BluetoothLeScanner mBluetoothLeScanner;
private ScanCallback mScanCallback;
callback class
/**
* Custom ScanCallback object - adds to adapter on success, displays error on failure.
*/
private class SampleScanCallback extends ScanCallback {
@Override
public void onBatchScanResults(List<ScanResult> results) {
super.onBatchScanResults(results);
for (ScanResult result : results) {
mAdapter.add(result);
}
mAdapter.notifyDataSetChanged();
}
@Override
public void onScanResult(int callbackType, ScanResult result) {
super.onScanResult(callbackType, result);
// Log.d("TEST 1:", String.valueOf(result.getScanRecord().getServiceUuids()));
// Log.d("TEST 2:", String.valueOf(result.getScanRecord().getServiceData()));
// Log.d("TEST 3:", String.valueOf(result.getScanRecord().getBytes()));
// Log.d("TEST 4:", String.valueOf(result.getDevice().getAddress()));
// Log.d("TEST 5:", String.valueOf(result.getScanRecord().getServiceData(Constants.Service_UUID)));
// Log.d("TEST 5:", String.valueOf(result.getScanRecord().getServiceData(Constants.CHARACTERISTIC_UUID)));
// Log.d("TEST 6:", String.valueOf(result.getDevice().getUuids()));
// Log.d("TEST 7:", String.valueOf(result.getScanRecord().getServiceData(Constants.Service_UUID)));
try{
Toast.makeText(getActivity(), new String(result.getScanRecord().getServiceData(Constants.CHARACTERISTIC_UUID)), Toast.LENGTH_SHORT).show();
} catch (Exception e) {
Toast.makeText(getActivity(), "ERROR", Toast.LENGTH_SHORT).show();
}
mAdapter.add(result);
mAdapter.notifyDataSetChanged();
}
@Override
public void onScanFailed(int errorCode) {
super.onScanFailed(errorCode);
Log.d("TEST ERROR:", "Scan failed with error: " + errorCode);
}
}
init bluetoothLeScanner
mBluetoothLeScanner = mBluetoothAdapter.getBluetoothLeScanner();
start, stop, filter, setting
/**
* Start scanning for BLE Advertisements (& set it up to stop after a set period of time).
*/
public void startScanning() {
if (mScanCallback == null) {
Log.d(TAG, "Starting Scanning");
// Will stop the scanning after a set time.
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
stopScanning();
}
}, SCAN_PERIOD);
// Kick off a new scan.
mScanCallback = new SampleScanCallback();
// mBluetoothLeScanner.startScan(mScanCallback);
mBluetoothLeScanner.startScan(buildScanFilters(), buildScanSettings(), mScanCallback);
String toastText = getString(R.string.scan_start_toast) + " "
+ TimeUnit.SECONDS.convert(SCAN_PERIOD, TimeUnit.MILLISECONDS) + " "
+ getString(R.string.seconds);
Toast.makeText(getActivity(), toastText, Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getActivity(), R.string.already_scanning, Toast.LENGTH_SHORT).show();
}
}
/**
* Stop scanning for BLE Advertisements.
*/
public void stopScanning() {
Log.d(TAG, "Stopping Scanning");
// Stop the scan, wipe the callback.
mBluetoothLeScanner.stopScan(mScanCallback);
mScanCallback = null;
// Even if no new results, update 'last seen' times.
mAdapter.notifyDataSetChanged();
}
/**
* Return a List of {@link ScanFilter} objects to filter by Service UUID.
*/
private List<ScanFilter> buildScanFilters() {
List<ScanFilter> scanFilters = new ArrayList<>();
ScanFilter.Builder builder = new ScanFilter.Builder();
// Comment out the below line to see all BLE devices around you
builder.setServiceUuid(Constants.Service_UUID);
scanFilters.add(builder.build());
return scanFilters;
}
/**
* Return a {@link ScanSettings} object set to use low power (to preserve battery life).
*/
private ScanSettings buildScanSettings() {
ScanSettings.Builder builder = new ScanSettings.Builder();
builder.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY);
return builder.build();
}