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; }}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
2015-03-07 判断一个指定的Service是否存在的方法
2014-03-07 Android应用加入微信分享
2014-03-07 Android Listener侦听的N种写法
2014-03-07 Android 滑动效果高级篇(八)—— 自定义控件
2014-03-07 Android 实现书籍翻页效果----完结篇
2014-03-07 Android 实现书籍翻页效果----升级篇
2014-03-07 Android 滑动效果高级篇(七)—— 华丽翻页效果