Android 蓝牙BLE开发从官方源码demo开始(一)

简介: Android 蓝牙BLE开发从官方源码demo开始(一)

1.前言

蓝牙在我们生活中扮演者许多重要的角色,蓝牙耳机、蓝牙音箱、蓝牙灯泡、蓝牙智能硬件等等!可见,蓝牙无处不在,而且也是物联网的基础纽带,它改变了我们的许多生活方式,给我们带来了许多益处。

前段时间我也简单地使用了小程序的蓝牙api操作,接下来我也要开始重新认识下Android蓝牙开发,蓝牙又分为经典蓝牙和BLE(低功耗蓝牙),这次我主要学习蓝牙BLE,所以我第一时间找了谷歌给我们提供了官方源码demo:

https://github.com/googlesamples/android-BluetoothLeGatt

2.权限

配置文件需要先声明蓝牙权限:

<!--蓝牙必须的权限-->
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

除了蓝牙权限外,还有如下权限是声明程序是否可用于支持BLE或者支持出BLE外的设备;如果required=true,则应用只能在支持BLE的Android设备上安装运行,不支持BLE的设备将finish。

<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>

此外还有一个很关键的问题,不知道你们在开发中有没有遇到过呢?官方demo没有适配到这里。Android6.0以上的手机仅仅是添加如上蓝牙权限是不行的,这将会造成无法扫描到其他设备,针对这问题,果断查了资料,需要添加位置权限;

<!--android6.0以上使用蓝牙需要的权限,否则在Android6.0以上的手机扫描不到蓝牙设备-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

在Android6.0以上 位置相关的权限属于运行时权限,所以代码同时也要请求一下 让用户确认,这个就不多说了。

3.是否支持蓝牙BLE

在前面的权限也说了如果required=true,则应用只能在支持BLE的Android设备上安装运行,不支持BLE的设备将finish;

如果想在java代码上实现上面的逻辑也是可以的,官方demo如下:

/**使用此检查确定设备是否支持BLE。 然后你可以有选择地禁用与BLE相关的功能。*/
if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
   Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT).show();
   finish();
}

4.初始化蓝牙适配器

初始化蓝牙适配器。 对于API级别18及更高级别,请通过BluetoothManager获取对BluetoothAdapter的引用。最后这里记得要判空!

        // Initializes a Bluetooth adapter.  For API level 18 and above, get a reference to
        // BluetoothAdapter through BluetoothManager.
        final BluetoothManager bluetoothManager =
                (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
        mBluetoothAdapter = bluetoothManager.getAdapter();
 
        // Checks if Bluetooth is supported on the device.
        if (mBluetoothAdapter == null) {
            Toast.makeText(this, R.string.error_bluetooth_not_supported, Toast.LENGTH_SHORT).show();
            finish();
            return;
        }

5.当前设备是否已开启蓝牙

要想操作蓝牙,必须确保在设备上启用蓝牙。如果当前未启用蓝牙,因此我们可以触发Intent调用系统显示一个对话框,要求用户授予启用蓝牙的权限。

       if (!mBluetoothAdapter.isEnabled()) {
            if (!mBluetoothAdapter.isEnabled()) {
                Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
            }
        }

6.初始化listview列表适配器

这里目的就是将扫描到的蓝牙设备显示到listview列表上,然后用户就可以点击对应的item,程序就可以进行下一步操作。这一步骤可根据需要定制。

7.扫描

官方demo的扫描方法如下,如果要扫描的话就要传入true执行scanLeDvice(true)方法,然后蓝牙适配器就调用startLeScan()方法进行扫描,mLeScanCallback是扫描回调,下面会说到;执行扫描的同时开启了一个延时操作,时间到了就调用stopLeScan()方法停止扫描。

我觉得这里设置了一个延时停止扫描操作是非常友好的,因为扫描非常耗资源。

       private void scanLeDevice(final boolean enable) {
        if (enable) {
            // Stops scanning after a pre-defined scan period.
            mHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    mScanning = false;
                    mBluetoothAdapter.stopLeScan(mLeScanCallback);
                    invalidateOptionsMenu();
                }
            }, SCAN_PERIOD);
 
            mScanning = true;
            mBluetoothAdapter.startLeScan(mLeScanCallback);
        } else {
            mScanning = false;
            mBluetoothAdapter.stopLeScan(mLeScanCallback);
        }
        invalidateOptionsMenu();
    }
 

接下来就看看扫描的Callback回调吧,这个回调里面有个onLeScan方法,蓝牙扫描成功后的结果会返回此方法中,然后就可以处理BluetoothDevice拿到设备信息 最后展示到前面初始化的listview列表中,大概流程就是这样。

      // Device scan callback.
    private BluetoothAdapter.LeScanCallback mLeScanCallback =
            new BluetoothAdapter.LeScanCallback() {
 
        @Override
        public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    mLeDeviceListAdapter.addDevice(device);
                    mLeDeviceListAdapter.notifyDataSetChanged();
                }
            });
        }
    };

接着再看看这个onLeScan方法中的值吧!

第一个参数device,表示一个远程蓝牙设备,里面有它独有的蓝牙地址Address和Name等,所以后续需要进行连接蓝牙操作也需要用到这里获取的蓝牙Address;

第二个参数rssi表示扫描到的设备信号强度,这里应该可以用来判断距离的远近。

第三个参数scanRecord表示远程设备提供的广告记录的内容。

至此已经完成初始化配置、一些设备的判断逻辑和扫描操作了,如果能成功地扫描到设备并展示到界面上的话,下一步如果用户点击了列表,将进行蓝牙连接和相关的读写操作!

所以下一篇文章不出意外的话,就是继续学习Android蓝牙的连接和读写操作:
Android 蓝牙BLE开发从官方源码demo开始(二)

相关文章
|
3天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
8天前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
10天前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异和挑战
【10月更文挑战第37天】在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统扮演着主角。它们各自拥有独特的特性、优势以及面临的开发挑战。本文将深入探讨这两个平台在开发过程中的主要差异,从编程语言到用户界面设计,再到市场分布的不同影响,旨在为开发者提供一个全面的视角,帮助他们更好地理解并应对在不同平台上进行应用开发时可能遇到的难题和机遇。
|
12天前
|
XML 存储 Java
探索安卓开发之旅:从新手到专家
【10月更文挑战第35天】在数字化时代,安卓应用的开发成为了一个热门话题。本文旨在通过浅显易懂的语言,带领初学者了解安卓开发的基础知识,同时为有一定经验的开发者提供进阶技巧。我们将一起探讨如何从零开始构建第一个安卓应用,并逐步深入到性能优化和高级功能的实现。无论你是编程新手还是希望提升技能的开发者,这篇文章都将为你提供有价值的指导和灵感。
|
10天前
|
存储 API 开发工具
探索安卓开发:从基础到进阶
【10月更文挑战第37天】在这篇文章中,我们将一起探索安卓开发的奥秘。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和建议。我们将从安卓开发的基础开始,逐步深入到更复杂的主题,如自定义组件、性能优化等。最后,我们将通过一个代码示例来展示如何实现一个简单的安卓应用。让我们一起开始吧!
|
11天前
|
存储 XML JSON
探索安卓开发:从新手到专家的旅程
【10月更文挑战第36天】在这篇文章中,我们将一起踏上一段激动人心的旅程,从零基础开始,逐步深入安卓开发的奥秘。无论你是编程新手,还是希望扩展技能的老手,这里都有适合你的知识宝藏等待发掘。通过实际的代码示例和深入浅出的解释,我们将解锁安卓开发的关键技能,让你能够构建自己的应用程序,甚至贡献于开源社区。准备好了吗?让我们开始吧!
23 2
|
12天前
|
Android开发
布谷语音软件开发:android端语音软件搭建开发教程
语音软件搭建android端语音软件开发教程!
|
20天前
|
编解码 Java Android开发
通义灵码:在安卓开发中提升工作效率的真实应用案例
本文介绍了通义灵码在安卓开发中的应用。作为一名97年的聋人开发者,我在2024年Google Gemma竞赛中获得了冠军,拿下了很多项目竞赛奖励,通义灵码成为我的得力助手。文章详细展示了如何安装通义灵码插件,并通过多个实例说明其在适配国际语言、多种分辨率、业务逻辑开发和编程语言转换等方面的应用,显著提高了开发效率和准确性。
|
19天前
|
Android开发 开发者 UED
安卓开发中自定义View的实现与性能优化
【10月更文挑战第28天】在安卓开发领域,自定义View是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何高效地创建和管理自定义View,以及如何通过代码和性能调优来确保流畅的交互体验。我们将一起学习自定义View的生命周期、绘图基础和事件处理,进而探索内存和布局优化技巧,最终实现既美观又高效的安卓界面。
28 5
|
17天前
|
JSON Java Android开发
探索安卓开发之旅:打造你的第一个天气应用
【10月更文挑战第30天】在这个数字时代,掌握移动应用开发技能无疑是进入IT行业的敲门砖。本文将引导你开启安卓开发的奇妙之旅,通过构建一个简易的天气应用来实践你的编程技能。无论你是初学者还是有一定经验的开发者,这篇文章都将成为你宝贵的学习资源。我们将一步步地深入到安卓开发的世界中,从搭建开发环境到实现核心功能,每个环节都充满了发现和创造的乐趣。让我们开始吧,一起在代码的海洋中航行!
下一篇
无影云桌面