• Android 蓝牙扫描代码


    /**
     * 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;    }}
  • 相关阅读:
    对流程和规范的思考
    我的一小时面试指南
    安全扫描工具nikto简单使用
    测试的角色
    测试的窘境
    关于重连测试的一点研究
    ETCD高可用特性学习
    Cgroup和Namespace在测试中的使用(下)
    单循环列表的删除前驱结点
    指针常量字符串
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/6513696.html
Copyright © 2020-2023  润新知