/**
* 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; }}

Android 蓝牙扫描代码的更多相关文章

  1. 【转】Android bluetooth介绍(三): 蓝牙扫描(scan)设备分析

    原文网址:http://blog.csdn.net/xubin341719/article/details/38584469 关键词:蓝牙blueZ  A2DP.SINK.sink_connect.s ...

  2. Android bluetooth介绍(三): 蓝牙扫描(scan)设备分析

    关键词:蓝牙blueZ  A2DP.SINK.sink_connect.sink_disconnect.sink_suspend.sink_resume.sink_is_connected.sink_ ...

  3. Android蓝牙BLE开发,扫描、连接、发送和读取信息;

    1.BLE开发权限 Android蓝牙BLE开发须打开蓝牙权限和6.0位置权限: <uses-permission android:name="android.permission.B ...

  4. Android 6.0 Kotlin 蓝牙扫描

    package com.arci.myapplication import android.app.Activityimport android.os.Bundleimport android.sup ...

  5. android中通过代码来设置蓝牙永久可见性

    废话不多说,直接阐述: 前段时间在搞一个android项目,其中有一个功能要求需要蓝牙可见性永久打开,但是开发过android蓝牙的程序员应该都知道,goole提供的api中没有设置蓝牙永久可见性的接 ...

  6. Android 蓝牙4.0 BLE

    Android ble (Bluetooth Low Energy) 蓝牙4.0,也就是说API level >= 18,且支持蓝牙4.0的手机才可以使用. BLE是蓝牙4.0的核心Profil ...

  7. android -- 蓝牙 bluetooth (三)搜索蓝牙

    接上篇打开蓝牙继续,来一起看下蓝牙搜索的流程,触发蓝牙搜索的条件形式上有两种,一是在蓝牙设置界面开启蓝牙会直接开始搜索,另一个是先打开蓝牙开关在进入蓝牙设置界面也会触发搜索,也可能还有其它触发方式,但 ...

  8. android -- 蓝牙 bluetooth (一) 入门

    前段时间在 网上看了一些关于android蓝牙的文章,发现大部分是基于老版本(4.1以前含4.1)的源码,虽然无碍了解蓝牙的基本原理和工作流程,但对着4.2.2的代码看起来总是有些遗憾.所以针对4.2 ...

  9. 深入了解Android蓝牙Bluetooth——《进阶篇》

    在 [深入了解Android蓝牙Bluetooth--<基础篇>](http://blog.csdn.net/androidstarjack/article/details/6046846 ...

随机推荐

  1. log4j+slf4j迁移到log4j2+slf4j (Servlet3.0)

    近期对系统中的旧项目实现log升级,选择了log4j2来取代log4j.作为最新一代的log实现.log4j2好在那里能够直接看log4j2性能章节. 这里写写怎样从log4j升级到log4j2. 1 ...

  2. session timer(一)

    功能介绍 SIP并没有为所建立的会话定义存活机制. 虽然用户代理能够通过会话特定的机制推断会话是否超时,可是代理server却做不到这点. 如此一来.代理server有时会无法推断会话是否还是活动的. ...

  3. 关于Maven报错的一些解决办法(别处贴的)

    1.警告:The tag handler class for "s:form"(org.apache.struts2.views.jsp.ui.FormTag) was not f ...

  4. 你如何理解 HTML5 的 section?会在什么场景使用?为什么这些场景使用 section 而不是 div?

    section元素表示文档或应用的一个部分.所谓“部分”,这里是指按照主题分组的内容区域,通常会带有标题.[也就是每个section对应不同的主题.注意是内容本身的主题,而不是其他人为设定的划分标准. ...

  5. SQL事务+异常

    BEGIN TRAN BEGIN TRY --这里写代码 --这里写代码 END TRY BEGIN CATCH ROLLBACK TRAN END CATCH COMMIT TRAN

  6. Ubuntu 12.04使用演示

    今年年初,发布了Ubuntu 12.04(代号Precise Pangolin),但正式版预计将于2012年的4月底发布,作者对最新版本的ubuntu做了试用,先将操作视频与大家分享.更多内容请关注本 ...

  7. Android 将HTML5封装成android应用APK文件的几种方法

    越来越多的开发者热衷于使用html5+JavaScript开发移动Web App.不过,HTML5 Web APP的出现能否在未来取代移动应用,就目前来说,还是个未知数.一方面,用户在使用习惯上,不喜 ...

  8. notepad++go语法高亮文件

    notepad++go语法高亮文件 下载 右键另存为下载后在语言栏中的自定义面板中直接导入,重启即可

  9. BZOJ 高精度开根 JAVA代码

    晓华所在的工作组正在编写一套高精度科学计算的软件,一些简单的部分如高精度加减法.乘除法早已写完了,现在就剩下晓华所负责的部分:实数的高精度开m次根.因为一个有理数开根之后可能得到一个无理数,所以这项工 ...

  10. Es5正则

    ##JSON(ES5) 前端后台都能识别的数据.(一种数据储存格式) XNL在JSON出来前 JSON不支持  undefinde和函数. 示列:let = '[{"useername&qu ...