/** * Created by rbq on 2016/11/1. */ import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.le.BluetoothLeScanner; import android.bluetooth.le.ScanCallback; import android.bluetooth.le.ScanResult; import android.content.Context; import android.os.Build; import android.os.Handler; import android.util.Log; import java.util.List; public class BleDevicesScanner implements Runnable { private static final String TAG = BleDevicesScanner.class.getSimpleName(); private static final int DEFAULT_SCAN_PERIOD = 3000;// 2秒钟 private final BluetoothAdapter adapter; private int scanPeriod = DEFAULT_SCAN_PERIOD; private BleScanCallback callback; private boolean Scaning = false; private boolean isstart = false; private Handler handler = new Handler(); private BluetoothLeScanner mScanner; private ScanCallback mScanCallback; private BluetoothAdapter.LeScanCallback mLeScanCallback; public void setCallback(BleScanCallback callback) { this.callback = callback; } private BleScaneStatusChanage scaneStatusChanage; public BleScaneStatusChanage getScaneStatusChanage() { return scaneStatusChanage; } public void setScaneStatusChanage(BleScaneStatusChanage scaneStatusChanage) { this.scaneStatusChanage = scaneStatusChanage; } public BleDevicesScanner(Context context) { adapter = BleUtils.getBluetoothAdapter(context); } public synchronized void setScanPeriod(int scanPeriod) { this.scanPeriod = scanPeriod < 0 ? DEFAULT_SCAN_PERIOD : scanPeriod; } public boolean isScanning() { return isstart; } public synchronized void start() { if (isstart) { return; } isstart = true; handler.post(this); } public synchronized void stop() { if (!isstart) { return; } isstart = false; handler.removeCallbacks(this); if (Scaning) { try { if (isSupportLollipop()) { if (mScanner != null&&mScanCallback!=null) { mScanner.stopScan(mScanCallback); } } else { if (adapter != null&&mLeScanCallback!=null) { adapter.stopLeScan(mLeScanCallback); } } if (scaneStatusChanage!=null){ scaneStatusChanage.onScaneStop(); } } catch (Exception e) { Log.i(TAG,"蓝牙停止异常"); }finally { Scaning = false; } Log.i(TAG, "停止扫描"); } } @Override public void run() { if (!adapter.isEnabled()){ return; } if (!Scaning) { Log.i(TAG, "开始扫描"); if (isSupportLollipop()) { if (mScanner==null) { mScanner = adapter.getBluetoothLeScanner(); } if (mScanner == null) { Scaning = false; } else { if (mScanCallback==null){ mScanCallback = new ScanCallback() { @Override public void onScanResult(int callbackType, ScanResult result) { super.onScanResult(callbackType, result); if (isSupportLollipop()) { byte[] scanRecord = null; if (result.getScanRecord() != null) { scanRecord = result.getScanRecord().getBytes(); } if (callback != null) { callback.onScan(result.getDevice(), result.getRssi(), scanRecord); } } } @Override public void onScanFailed(int errorCode) { super.onScanFailed(errorCode); Log.i(TAG,"扫描失败"); } @Override public void onBatchScanResults(List<ScanResult> results) { super.onBatchScanResults(results); } }; } mScanner.startScan(mScanCallback); Scaning = true; } } else { if (mLeScanCallback==null){ mLeScanCallback = new BluetoothAdapter.LeScanCallback(){ @Override public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) { if (callback!=null){ callback.onScan(device,rssi,scanRecord); } } }; } Scaning = adapter.startLeScan(mLeScanCallback); } if (scaneStatusChanage!=null){ scaneStatusChanage.onScaneStart(); } } else if (Scaning) { Log.i(TAG, "停止扫描"); synchronized (this) { if (!Scaning) return; } try { if (isSupportLollipop()) { if (mScanner != null&&mScanCallback!=null) { mScanner.stopScan(mScanCallback); } } else { if (adapter != null&&mLeScanCallback!=null) { adapter.stopLeScan(mLeScanCallback); } } } catch (Exception e) { Log.i(TAG,"蓝牙停止异常"); } Scaning = false; if (scaneStatusChanage!=null){ scaneStatusChanage.onScaneStop(); } } handler.postDelayed(this, scanPeriod); } public boolean isSupportLollipop() { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP; }}