/**
* 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. KETTLE使用javascript步骤过滤特殊字符

    KETTLE使用javascript步骤过滤特殊字符 使用kettle在抽取大量excel数据时.总是遇到excel中有一些特殊字符,导致ExecuteSQL script步骤运行失败,本文记录一些方 ...

  2. 用AOP改善javascript代码

    Aop又叫面向切面编程,用过spring的同学肯定对它非常熟悉,而在js中,AOP是一个被严重忽视的技术点,这篇就通过下面这几个小例子,来说说AOP在js中的妙用. 1, 防止window.onloa ...

  3. FFT之大数乘法

    #include <iostream> #include <stdio.h> #include <cmath> #include <algorithm> ...

  4. C#List<string>和string[]之间的相互转换

     一.LIST概述 所属命名空间:System.Collections.Generic      public class List<T> : IList<T>, IColle ...

  5. vue组件中 IS 用法

    //html <link rel="stylesheet" href="http://www.jq22.com/demo/animate-141106223642/ ...

  6. react-native React Native version mismatch

    android/app/build.gradle     file: dependencies { compile fileTree(dir: "libs", include: [ ...

  7. 迅雷云监工crysadm搭建

    之前在淘宝众筹买了个迅雷赚钱宝Pro,2016年01月到手,玩了半个月. 之后在看百度贴吧时,看到好多大神都在用PC上用网页版软件来管理赚钱宝.非常是好奇.搜索了非常多资料,基本上都已经过时了.都无法 ...

  8. hdu 1588 Gauss Fibonacci(矩阵嵌矩阵)

    题目大意: 求出斐波那契中的 第 k*i+b 项的和. 思路分析: 定义斐波那契数列的矩阵 f(n)为斐波那契第n项 F(n) = f(n+1) f(n) 那么能够知道矩阵 A = 1 1 1  0 ...

  9. google 分屏 横屏模式 按home键界面错乱故障分析(二) 分屏的启动过程

    google 进入分屏后在横屏模式按home键界面错乱(二) 你确定你了解分屏的整个流程? imageMogr2/auto-orient/strip%7CimageView2/2/w/1240&quo ...

  10. OPENSSL 制作 Ikev2证书

    OPENSSL 制作 Ikev2证书 在一个 VPS 上配置 IKEV2 VPN 服务器时,用 OPENSSL 制作了所需的数字证书,奇怪的怎么弄都无法连接服务器,一直提示 "IKE_SA ...