package com.example.bluetooth.le;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
public class DeviceScanner {
/**
* @author Jongseok Choi
*/
public static final String MIO_DEVICE_NAME = "MIO GLOBAL LINK";
public static final String MSG_KEY_DEVICE_NAME = "deviceName";
public static final String MSG_KEY_DEVICE_ADDRESS = "deviceAddress";
private BluetoothManager mBluetoothManager;
private BluetoothAdapter mBluetoothAdapter;
private boolean mScanning;
private Handler mHandler;
private Runnable scanningDelayChecker;
private Handler scannerMsgHandler;
// Stops scanning after 10 seconds.
private static final long SCAN_PERIOD = 10000;
public DeviceScanner(BluetoothManager bluetoothManager, Handler scannerMsgHandler){
this.scannerMsgHandler = scannerMsgHandler;
mBluetoothManager = bluetoothManager;
}
public BluetoothAdapter initialize() {
mHandler = new Handler();
mBluetoothAdapter = mBluetoothManager.getAdapter();
return mBluetoothAdapter;
}
public boolean isScanning(){
return mScanning;
}
/**
* @author Jongseok Choi
* @param device
*/
private void selectDevice(BluetoothDevice device){
if(null == device)
return;
Message msg = Message.obtain();
Bundle data = new Bundle();
data.putString(MSG_KEY_DEVICE_NAME, device.getName());
data.putString(MSG_KEY_DEVICE_ADDRESS, device.getAddress());
msg.setData(data);
scannerMsgHandler.sendMessage(msg);
}
public void close(){
if (mScanning) {
mBluetoothAdapter.stopLeScan(mLeScanCallback);
mScanning = false;
mHandler.removeCallbacks(scanningDelayChecker);
}
}
public void scanLeDevice(final boolean enable) {
if (enable) {
// Stops scanning after a pre-defined scan period.
scanningDelayChecker = new Runnable() {
@Override
public void run() {
mScanning = false;
mBluetoothAdapter.stopLeScan(mLeScanCallback);
}
};
mHandler.postDelayed(scanningDelayChecker, SCAN_PERIOD);
mScanning = true;
mBluetoothAdapter.startLeScan(mLeScanCallback);
} else {
mScanning = false;
mBluetoothAdapter.stopLeScan(mLeScanCallback);
}
}
// Device scan callback.
private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {
if(null!=device && null!=device.getName()){
if(device.getName().startsWith(MIO_DEVICE_NAME)){
Log.i(null, "SCANNED " + device.getName() + " : " + device.getAddress());
selectDevice(device);
}
}
}
};
}