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;    }}
时间: 2024-10-08 19:01:40

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

Android bluetooth介绍(二): android 蓝牙代码架构及其uart 到rfcomm流程

关键词:蓝牙blueZ  UART  HCI_UART H4  HCI  L2CAP RFCOMM  版本:基于android4.2之前版本 bluez内核:linux/linux3.08系统:android/android4.1.3.4作者:xubin341719(欢迎转载,请注明作者,请尊重版权谢谢)欢迎指正错误,共同学习.共同进步!!一.Android Bluetooth Architecture蓝牙代码架构部分(google 官方蓝牙框架) Android的蓝牙系统,自下而上包括以下一些

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

关键词:蓝牙blueZ  A2DP.SINK.sink_connect.sink_disconnect.sink_suspend.sink_resume.sink_is_connected.sink_get_properties.AUDIO.DBUS版本号:基于android4.2之前版本号 bluez内核:linux/linux3.08系统:android/android4.1.3.4作者:xubin341719(欢迎转载.请注明作者.请尊重版权谢谢)欢迎指正错误.共同学习.共同进步!! 參考

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

原文网址:http://blog.csdn.net/xubin341719/article/details/38584469 关键词:蓝牙blueZ  A2DP.SINK.sink_connect.sink_disconnect.sink_suspend.sink_resume.sink_is_connected.sink_get_properties.AUDIO.DBUS版本:基于android4.2之前版本 bluez内核:linux/linux3.08系统:android/android4

Android蓝牙自动配对Demo,亲测好使!!!

蓝牙自动配对,即搜索到其它蓝牙设备之后直接进行配对,不需要弹出配对确认框或者密钥输入框. 转载请注明出处http://blog.csdn.net/qq_25827845/article/details/52400782 经过最近一段时间得研究,针对网上给出的案例.总结了一个亲测好使的Demo. 说明如下: 1.本Demo用来连接蓝牙设备HC-05,如果你要连接其他蓝牙设备,注意修改相关名字以及修改设备初试pin值. 2.将Demo安装在Android手机上,点击按钮,可以实现与目标蓝牙设备的自动

Android 蓝牙4.0 BLE

Android ble (Bluetooth Low Energy) 蓝牙4.0,也就是说API level >= 18,且支持蓝牙4.0的手机才可以使用. BLE是蓝牙4.0的核心Profile,主打功能是快速搜索,快速连接,超低功耗保持连接和传输数据,弱点是数据传输速率低,由于BLE的低功耗特点,因此普遍用于穿戴设备. 官方demo:http://developer.android.com/guide/topics/connectivity/bluetooth-le.html 官方demo(

[Android]蓝牙系统

1.1 蓝牙技术简介 蓝牙(Bleuetooth)原是十世纪统一了丹麦的一个国王的名字,现取其"统一"的含义,用来意在统一无线局域网通讯的标准的蓝牙技术.蓝牙技 术是爱立信,IBM,Intel等世界5家著名大公司在1998年联合推出的一项无线通讯规范.随后成立的蓝牙技术特殊兴趣组织(SIG)来负责该技术的 开发和技术协议的制定,如今全世界已有1800多家公司加盟该组织,最近微软公司也正式加盟并成为SIG组织的领导成员之一.它以低成本的近距离无线连接 为基础,为移动通信设备建立一个短程无

ym——物联网入口之一Android蓝牙4.0

如果还有同学不知道蓝牙4.0可以做什么请查看Android+蓝牙 4.0 将带来什么?,现在可以穿戴设备也大多用的是蓝牙4.0,如 智能体质秤,智能手环,智能血压计等等. 安卓4.3(API 18)为BLE的核心功能提供平台支持和API,App可以利用它来发现设备.查询服务和读写特性.相比传统的蓝牙,BLE更显著的特点是低功耗.这一优点使android App可以与具有低功耗要求的BLE设备通信,如近距离传感器.心脏速率监视器.健身设备等. 关键术语和概念 Generic Attribute P

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

在 [深入了解Android蓝牙Bluetooth--<基础篇>](http://blog.csdn.net/androidstarjack/article/details/60468468)一篇中我们对蓝牙的各个版本的有了一个认识,蓝牙版本的历程及其优劣式介绍.那么接下来咱们就深入一点继续开车进入BLE的进及篇章. 蓝牙BLE4.x BLE分为三部分: Service Characteristic Descriptor 这三部分都用UUID作为唯一标识符.UUID为这种格式:0000ffe1

android -- 蓝牙 bluetooth (一) 入门

前段时间在 网上看了一些关于android蓝牙的文章,发现大部分是基于老版本(4.1以前含4.1)的源码,虽然无碍了解蓝牙的基本原理和工作流程,但对着4.2.2的代码看起来总是有些遗憾.所以针对4.2.2版本代码整理下相关知识,当然蓝牙工作的主干流程是没有变的,上电.加载驱动这些动作少不了的,只是这些功能的实现代码位置变了不少.希望本文可以让大家对android4.2的蓝牙部分代码有一个初步的了解.         正文开始前,先明确代码版本:android  jellyBean 4.2.2,后