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; }}
Android 蓝牙扫描代码的更多相关文章
- 【转】Android bluetooth介绍(三): 蓝牙扫描(scan)设备分析
原文网址:http://blog.csdn.net/xubin341719/article/details/38584469 关键词:蓝牙blueZ A2DP.SINK.sink_connect.s ...
- Android bluetooth介绍(三): 蓝牙扫描(scan)设备分析
关键词:蓝牙blueZ A2DP.SINK.sink_connect.sink_disconnect.sink_suspend.sink_resume.sink_is_connected.sink_ ...
- Android蓝牙BLE开发,扫描、连接、发送和读取信息;
1.BLE开发权限 Android蓝牙BLE开发须打开蓝牙权限和6.0位置权限: <uses-permission android:name="android.permission.B ...
- Android 6.0 Kotlin 蓝牙扫描
package com.arci.myapplication import android.app.Activityimport android.os.Bundleimport android.sup ...
- android中通过代码来设置蓝牙永久可见性
废话不多说,直接阐述: 前段时间在搞一个android项目,其中有一个功能要求需要蓝牙可见性永久打开,但是开发过android蓝牙的程序员应该都知道,goole提供的api中没有设置蓝牙永久可见性的接 ...
- Android 蓝牙4.0 BLE
Android ble (Bluetooth Low Energy) 蓝牙4.0,也就是说API level >= 18,且支持蓝牙4.0的手机才可以使用. BLE是蓝牙4.0的核心Profil ...
- android -- 蓝牙 bluetooth (三)搜索蓝牙
接上篇打开蓝牙继续,来一起看下蓝牙搜索的流程,触发蓝牙搜索的条件形式上有两种,一是在蓝牙设置界面开启蓝牙会直接开始搜索,另一个是先打开蓝牙开关在进入蓝牙设置界面也会触发搜索,也可能还有其它触发方式,但 ...
- android -- 蓝牙 bluetooth (一) 入门
前段时间在 网上看了一些关于android蓝牙的文章,发现大部分是基于老版本(4.1以前含4.1)的源码,虽然无碍了解蓝牙的基本原理和工作流程,但对着4.2.2的代码看起来总是有些遗憾.所以针对4.2 ...
- 深入了解Android蓝牙Bluetooth——《进阶篇》
在 [深入了解Android蓝牙Bluetooth--<基础篇>](http://blog.csdn.net/androidstarjack/article/details/6046846 ...
随机推荐
- UVA 558 Wormholes 【SPFA 判负环】
题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_proble ...
- QT就是别人好心帮你做一些枯燥,并且很重复的代码编写工作,让你更好的把精力投入到你界面的逻辑和功能的实现的功能库(否则写了上万行代码了,才写出个BUG一大堆的毛坯)
好了,现在开始记录我学习QT的学习历程 . 本人也不是计算机专业出来的,自学了一点,但还是不好找工作,于是参加了培训,虽然感觉没多学到什么 编程的学习生涯就是不断的看别人的源码,然后自己参考着写写自己 ...
- js---18miniJquery
<html> <head> <title>jQuery test</title> </head> <body> <div ...
- js中Array.prototype.push.call的用法
var arr = [] Array.prototype.push.call(arr,"a","b","c") <==> []. ...
- SQL优化工具SQLAdvisor使用(转)
一.简介 在数据库运维过程中,优化SQL是业务团队与DBA团队的日常任务.例行SQL优化,不仅可以提升程序性能,还能够降低线上故障的概率. 目前常用的SQL优化方式包括但不限于:业务层优化.SQL逻辑 ...
- Android中关于JNI 的学习(零)简单的样例,简单地入门
Android中JNI的作用,就是让Java可以去调用由C/C++实现的代码,为了实现这个功能.须要用到Anrdoid提供的NDK工具包,在这里不讲怎样配置了,好麻烦,配置了好久. . . 本质上,J ...
- “此文件来自其他计算机,可能被阻止以帮助保护该计算机” 教你win7解除阻止程序运行怎么操作
win7 批量解除可执行文件的锁定 "此文件来自其他计算机,可能被阻止以帮助保护该计算机" http://blog.csdn.net/gscsnm/article/details/ ...
- matlab 构建数据集实用 api
我们当前有如下目录结构的图像数据集(用于图像分类): 1. imageDatastore imageDatastore:imds = imageDatastore('./images', 'Inclu ...
- 洛谷P3391 【模板】文艺平衡树(Splay)(FHQ Treap)
题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1, ...
- Day3晚笔记
DEV C++扩展栈空间 -Wl,--stack=64000000000 带权二分图匹配 建一个超级源点S,超级汇点T 把左边的点的点权作为权值,连一条S到左边的点的边 把右边的点的点权作为权值,连一 ...