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