android L BLE Central(Scanner)牛刀小试

转载请表明作者:http://blog.csdn.net/lansefeiyang08/article/details/46482073

昨天写了android L BLE Peripheral的简单使用,今天讲一下BLE Central的更新。

搞过android4.4的人肯定对BluetoothAdapter的startLeScan函数不会陌生,但是在android L已经弃用此接口,但是为了兼容以前的版本,这个接口还是可以使用的。但是谷歌已经单独拿出来android.bluetooth.le类來处理BLE的操作,所以我建议还是用最新的接口开发。如果想要兼容L之前的版本,可以用 android.os.Build.VERSION.SDK_INT或者
android.os.Build.VERSION.RELEA加一个版本判断就可以。下面就來正式认识一下BLE Scanner的更新。

在android L Central一共添加了6个scan的相关类(4个advertise相关类),这6个类把scan相关部分分得很细。按照上一篇Peripheral的思路,我们还是按照启动scan流程來学习这个类。

1、关于判断是否支持蓝牙、支持BLE的代码我就不写了,下面我只贴一下支持BLE centrial的代码:

mBluetoothLeScanner = mBluetoothAdapter.getBluetoothLeScanner();

这句代码和Peripheral的getBluetoothLeAdvertiser基本类似,一般手机支持BLE都会支持Central,除非是本身就只是外设设备。这个不难,我就不浪费时间了。

2、这里就直接进入scan动作了,新的接口把scan分为了两类,一种为:

    /**
     * Start Bluetooth LE scan with default parameters and no filters. The scan results will be
     * delivered through {@code callback}.
     * <p>
     * Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN} permission.
     *
     * @param callback Callback used to deliver scan results.
     * @throws IllegalArgumentException If {@code callback} is null.
     */
    public void startScan(final ScanCallback callback) {
        if (callback == null) {
            throw new IllegalArgumentException("callback is null");
        }
        startScan(null, new ScanSettings.Builder().build(), callback);
    }

从函数你肯定就懂,这个是直接搜索全部周围peripheral设备,当然这里你要填写callback,具体的我下面会讲。

第二种为:

    /**
     * Start Bluetooth LE scan. The scan results will be delivered through {@code callback}.
     * <p>
     * Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN} permission.
     *
     * @param filters {@link ScanFilter}s for finding exact BLE devices.
     * @param settings Settings for the scan.
     * @param callback Callback used to deliver scan results.
     * @throws IllegalArgumentException If {@code settings} or {@code callback} is null.
     */
    public void startScan(List<ScanFilter> filters, ScanSettings settings,
            final ScanCallback callback) {
        startScan(filters, settings, callback, null);
    }

这一种明显属于定制化的函数了,因为他需要我们输入过滤条件。这里的ScanFilter和ScanSettings又是两个scan类,当然这两个类的目的主要是为了有些人想单独为某个产品开发应用,把过滤条件加上,比如DeviceName或者某个Service UUID等等,就可以搜索出只针对特定Peripheral特性的设备。

拿着两个条件我们怎么用呢,我给大家写一点,大家可以参考我写的自己添加:

// add a filter to only scan for advertisers with the given service UUID
        List<ScanFilter> bleScanFilters = new ArrayList<>();
        bleScanFilters.add(
                new ScanFilter.Builder().setServiceUuid(SAMPLE_UUID).build()
        );

        ScanSettings bleScanSettings = mBleScanSettingsBuilder.build();

        Log.d(TAG, "Starting scanning with settings:" + bleScanSettings + " and filters:" + bleScanFilters);

        // tell the BLE controller to initiate scan
        mBluetoothLeScanner.startScan(bleScanFilters, bleScanSettings, mBleScanCallback);

单独看这两个新的接口,可能有些人会迷惑,本来不久应该是这样吗?其实Andoid L之前,scan接口不是这样的,它只有一下两种

    @Deprecated
    public boolean startLeScan(LeScanCallback callback) 
@Deprecated
    public boolean startLeScan(final UUID[] serviceUuids, final LeScanCallback callback) 

你会发现,原来的scan只能通过service UUID去搜索,其他条件都不行,所以新版本的接口为我们定制应用提供了很大的便利。

3、搜索完了,那就要拿到scan的callback了。在这里,我就拿第一种格式来讲。

ScanCallBack有三个回调,当然callback也单独是一个类,这里我只讲讲对我们有用的 onScanResult(int callbackType, ScanResult result),为了大家理解,我直接给大家看看我搜索出来的结果:

<span style="font-size:14px;">callbackType:1
ScanResult{mDevice=B4:52:7E:9A:41:A8,mScanRecord=ScanRecord [mAdvertiseFlags=6,mServiceUuids=[00001804-0000-1000-8000-00805f9b34fb,
00001802-0000-1000-8000-00805f9b34fb,00001803-0000-1000-8000-00805f9b34fb,00000200-37cb-11e3-8682-0002a5d5c51b],
mManufacturerSpecificData={}, mServiceData={},mTxPowerLevel=0, mDeviceName=××××],mRssi=-43, mTimestampNanos=352640634804615}</span>

从这个结果可以看出来,现在scan返回的结果明显增加了,其实从结果大家应该也能理解,第二种设置过滤的话会有哪些参数可以让你去设置。

你看到这些结果你肯定晕了,这要怎么拿出来,这就用到了Scan相关类的最后两个类ScanResult和ScanRecord。这两个类主要是用来解析你scan后数据的,我这里也贴一点代码,大家如果是需要其他结果,可以参考一下:

        BluetoothDevice device = result.getDevice();
        Log.d(TAG, "Device name: " + device.getName());
        Log.d(TAG, "Device address: " + device.getAddress());
        Log.d(TAG, "Device service UUIDs: " + device.getUuids());

        ScanRecord record = result.getScanRecord();
        Log.d(TAG, "Record advertise flags: 0x" + Integer.toHexString(record.getAdvertiseFlags()));
        Log.d(TAG, "Record Tx power level: " + record.getTxPowerLevel());
        Log.d(TAG, "Record device name: " + record.getDeviceName());
        Log.d(TAG, "Record service UUIDs: " + record.getServiceUuids());
        Log.d(TAG, "Record service data: " + record.getServiceData());

这里的result就是onScanResult(int callbackType, ScanResult result)的返回值。

4、最后一步就是stop,这个大家应该很熟了,用一个postdelay如下:

        // post a future task to stop scanning after (default:25s)
        mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                stopScanning();
            }
        }, DEFAULT_SCAN_PERIOD);

或者直接调用stop,这里的stopScanning实现如下:

    private void stopScanning() {
        if (mBluetoothLeScanner != null) {
            Log.d(TAG, "Stop scanning.");
            mBluetoothLeScanner.stopScan(mBleScanCallback);
        }
    }

剩下的就是connectGatt了。这个和以前还是一样的,目前没有变化。

ok,对于google新添加的android.bluetooth.le这个package算是解析完了,接下来几天就要看看android L系统里是怎么实现的了。

时间: 2024-09-29 02:33:19

android L BLE Central(Scanner)牛刀小试的相关文章

android L BLE Peripheral牛刀小试

知道Android L对蓝牙对了一些改进,包括添加A2dp sink.HFP client.BLE Peripheral功能等等. 我花了一天多时间对Android L BLE Peripheral SDK进行了研究,网上的资料很少,有一个介绍的还不够清晰,所以就自己写了一个测试应用,希望可以对理解BLE Peripheral有一定的帮助. 此贴主要以讲解代码为主,我会把项目代码也传到CSDN中,帮助大家测试. 首先说明一点,并不是Android L的系统就可以支持BLE Peripheral,

android5.0(Lollipop) BLE Central牛刀小试

转载请表明作者:http://blog.csdn.net/lansefeiyang08/article/details/46482073 昨天写了android L BLE Peripheral的简单使用,今天讲一下BLE Central的更新. 搞过android4.4的人肯定对BluetoothAdapter的startLeScan函数不会陌生,但是在android L已经弃用此接口,但是为了兼容以前的版本,这个接口还是可以使用的.但是谷歌已经单独拿出来android.bluetooth.l

ANDROID L——Material Design具体解释(主题和布局)

转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990).谢谢支持! Android L: Google已经确认Android L就是Android Lollipop(5.0). Google之前就已经提前推出了Android L Developer Preview(开发人员预览版)来帮助开发人员更快的了解Android特性.而不久前也推出了64位的模拟器镜像.并且首次搭载Android L系统的Nexus 6和 Nexus 9也即将上市. 相信Andro

[Android L]SEAndroid开放设备文件结点权限(读或写)方法(涵盖常用操作:sys/xxx、proc/xxx、SystemProperties)

温馨提示 建议你先了解一下上一篇博文([Android L]SEAndroid增强Androd安全性背景概要及带来的影响)所讲的内容,先对SEAndroid窥个全貌,然后再继续本节内容. 1 现象描述 基于Android L版本源码环境进行开发时,根据项目需求,APP层需要操作sys/xxx 或 proc/xxx下面的文件结点,但是会报出以下权限异常,无法直接操作这些结点 LedLightFileUtil( 4671): java.io.FileNotFoundException: /sys/c

Android L 漫游浅析

这篇文章主要是分析在Android L 源代码中对手机漫游的处理.当然我这里所说的漫游指的是国际漫游.通常我们判断手机是否在国际漫游,第一个想法就是比较网络上获取的MCC+MNC是否与手机中的IMSI相同,如果不同就判断为漫游了.如果是漫游的话,手机上最直观的可以看到就是两个地方了: a . 手机的屏幕的状态拦上手机信号角标的左下方是否有"R"显示. b . Setting --->About phone --->Status --->Roming 当然这是最粗略的比

Android L Camera2 API 使用实例程序汇总

在网上发现几个使用Camera API2开发的实例程序,总结一下方便后续参考: 1.Camera2 Basic : https://github.com/googlesamples/android-Camera2Basic This sample demonstrates how to use basic functionalities of Camera2 API. You can learn how to iterate through characteristics of all the

Android L Preview for mako本人编译版的启动log

本人没此手机, log由cofface获取, 目前是卡到开机动画: https://gist.github.com/syhost/d9f2481b28d5aa8b01a0 编译时使用的vendor是Android4.4.4的, 看log貌似ks大面积报错, 也可能是内核跟vendor不搭配 Android L Preview for mako本人编译版的启动log,布布扣,bubuko.com

[Android L]SEAndroid增强Androd安全性背景概要及带来的影响

1  SEAndroid背景 Android对于操作系统安全性方面的增强一直沿用Linux内核所提供的MAC强制访问控制套件SELinux,对权限进行了更为深度的管理,有效地控制着进程对资源的访问.2012年才问世的SE Android将SELinux移植到Android平台上,以降低恶意应用程序攻击带来的损害,提供Android系统的防御能力. SE Android(Secutity-Enhanced Android)是Android与SE Linux的结合,由美国NSA在2012年推出的An

ANDROID L——Material Design详解(主题和布局)

Android L: Android L可能就是Android Lollipop或者Lemon Pie(4.5或者5.0),因为Google一直以来都是用甜点为版本命名. Google之前就已经提前推出了Android L Developer Preview(开发者预览版)来帮助开发者更快的了解Android特性,而不久前也推出了64位的模拟器镜像.相信Android L正式版也不远了,所以是时候开始学习Android L了. 关于Android L如何配置模拟器和创建项目,如果大家有兴趣的话可