Android 蓝牙开发(二) --手机与蓝牙音箱配对,并播放音频
Android 蓝牙开发(一) – 传统蓝牙聊天室
Android 蓝牙开发(三) – 低功耗蓝牙开发
项目工程BluetoothDemo
上一章中,我们已经学习了传统蓝牙的开发,这一章,我们来学习如何让手机与蓝牙耳机、音箱等连接配对,并实现音频传输。
一、基础知识
前面在 Android 蓝牙开发(一) – 传统蓝牙聊天室 的文章中,我们已经对蓝牙知识有个基本认识。而且从 Android 3.0 开始,Bluetooth API 支持蓝牙配置文件,蓝牙配置文件是适用于设备间蓝牙通信的无线接口规范。
举个例子:免提配置文件。如果手机要与无线耳机进行连接,则两台设备都必须支持免提配置文件。
而这一章中,我们要学习的就是 A2DP 配置文件
- A2DP:蓝牙立体声音频传输配置文件 (A2DP) ,定义了如何通过蓝牙连接和流式传输,将高质量音频从一个设备传输至另一个设备。Android 提供 BluetoothA2dp 类,该类是用于控制蓝牙 A2DP 服务的代理。
同时,A2DP 也定义了两个角色:
- Audio Source :(音频源) 音频的输入端对音频数据进行编码,发送到Sink端,一般指手机或者其他多媒体设备
- Audio Sink : (音频接收器) 接收到音频数据后,进行解码操作还原出音频,常见为蓝牙音箱或耳机
二、连接设备
那么如何去连接一个蓝牙配置文件呢?你需要遵循以下几个步骤:
- 获取 BluetoothAdapter
- 设置 BluetoothProfile.ServiceListener,它会监听 BluetoothProfile 客户端连接到服务或断开服务时回调
- 通过 BluetoothAdapter 的 getProfileProxy() 方法,传入上面的BluetoothProfile.ServiceListener 和 BluetoothProfile.A2DP ,拿到 BluetoothA2dp 对象。
- 使用 BluetoothDevice 去配置或者直接连接
- 使用 bluetoothAdapter.closeProfileProxy() 关闭代理对象
那么,我们可以这样写:
bluetooth = BluetoothAdapter.getDefaultAdapter()
//拿到代理对象bluetooth.getProfileProxy(this, object : BluetoothProfile.ServiceListener {override fun onServiceConnected(profile: Int, proxy: BluetoothProfile?) {if (profile == BluetoothProfile.A2DP) {//拿到 BluetoothA2dpbluetoothA2dp = proxy as BluetoothA2dp}}override fun onServiceDisconnected(profile: Int) {if (profile == BluetoothProfile.A2DP) {bluetoothA2dp = null}}}, BluetoothProfile.A2DP)
接着,需要使用到 BluetoothDevie,这个可以通过 BluetoothAdapter 拿到已配对或直接发现周围设备区拿到,如果你对这个不熟悉,可以查看这篇文章 Android 蓝牙开发(一) – 传统蓝牙聊天室。
首先,当还未配对时,先执行配对方法:
//未配对if (device.bondState != BluetoothDevice.BOND_BONDED) {val createSocket =BluetoothDevice::class.java.getMethod("createRfcommSocket",Int::class.java)createSocket.isAccessible = true//找一个通道去连接即可,channel 1~30socket = createSocket.invoke(device, 1) as BluetoothSocket//阻塞等待socket?.connect()//延时,以便于去连接sleep(2000)}
可以看到,这里使用了反射,用 createRfcommSocket() 方法去建立 RFCOMM 通道,为啥不用 createRfcommSocketToServiceRecord(UUID) ?因为不知道蓝牙音箱或耳机等的 UUID 啊,所以我们用这个方法,用某个通道去尝试连接他们。
当配对之后,只是绑定了设备,还未连接,所以要执行连接的操作:
//连接 a2dp
val connect =BluetoothA2dp::class.java.getMethod("connect", BluetoothDevice::class.java)
connect.isAccessible = true
val isSuccess = connect.invoke(bluetoothA2dp, device) as Boolean
if (isSuccess) {listener.onConnected()break
} else {listener.onFail("Blue connect fail ")
}
可以看到,也是用到了反射的方法的 connect ,它可以通过配置文件去连接设备,这样执行只有,你就能听到的蓝牙音箱或耳机提示 “连接已成功” 的提示音了。
然后你播放一下手机的音视频,发现声音已经传输过去了。
我们无需自己去实现音频的数据传输,BluetoothA2DP 已经帮我们实现好了。
当然,如果你想自己编码且传输数据,再进行解码也是可以的,自己去搞吧。。。
下一章,我们将学习低功耗蓝牙
Android 蓝牙开发(二) --手机与蓝牙音箱配对,并播放音频相关推荐
- 【Android游戏开发二十七】讲解游戏开发与项目下的hdpi 、mdpi与ldpi资源文件夹以及游戏高清版本的设置...
今天一个开发者问到我为什么游戏开发要删除项目下的hdpi.mdpi和ldpi文件夹:下面详细给大家解答一下: 首先童鞋们如果看过我写的<[Android游戏开发二十一]Android os设备谎 ...
- Google Maps API v2 android版本开发 国内手机不支持google play Service相关问题解决--图文教程
Google Maps API v2 android版本开发 国内手机不支持google play Service相关问题解决--图文教程 参考文章: (1)Google Maps API v2 an ...
- Android画板开发(二) 橡皮擦实现
Android画板开发(一) 基本画笔的实现 Android画板开发(二) 橡皮擦实现 Android画板开发(三) 撤销反撤销功能实现 Android画板开发(四) 添加背景和保存画板内容为图片 A ...
- 【Bluetooth蓝牙开发】一、蓝牙开发入门
一.蓝牙开发入门 文章目录 一.蓝牙开发入门 1.蓝牙概念 2.蓝牙发展历程 3.蓝牙技术概述 3.1 Basic Rate(BR) 3.2 Low Energy(LE) 4.常见蓝牙架构 4.1 S ...
- Android蓝牙开发(一)蓝牙模块及核心API
本文主要介绍Android蓝牙开发中基础知识:蓝牙模块及核心API. 关于蓝牙的连接及通讯功能实现,欢迎查阅下一篇文章:Android蓝牙开发(二)蓝牙消息传输实现. 蓝牙模块 从蓝牙4.0开始包含两 ...
- 【Android】蓝牙开发——BLE(低功耗蓝牙)(附完整Demo)
目录 目录 前言 一.相关概念介绍 二.实战开发 三.项目演示 四.Demo案例源码地址 五.更新记录 1.2020/12/29 :修改 setupService()中错误 2.2021/05/14 ...
- Android蓝牙开发前序知识-经典蓝牙低功耗蓝牙区别
最近从网上搜了(抄了)一些经典蓝牙和低功耗蓝牙的区别.关于蓝牙的大概了解,前文已经描述过了. Android中的蓝牙 说到Android中的蓝牙,大家听到的可能有蓝牙1.0.蓝牙2.0.蓝牙3.0.蓝 ...
- Android 蓝牙开发,申请打开蓝牙
申请打开蓝牙 <!-- 蓝牙权限 --> <uses-permission android:name="android.permission.BLUETOOTH" ...
- nimble 蓝牙开发一:BLE 蓝牙 Host 规范概述
目录 nimble 蓝牙开发一:概述 一.BLE 简介 二.BLE 基础知识 蓝牙设备地址 BLE 广播类型 标准广播数据 三.BLE 工作概述 BLE 常见的操作有: BLE 常见的工作流程: 四. ...
最新文章
- [Google API](6)拼写检查器和缓存页面
- paip.无线路由器的无线接入WAN方式WDS设置大法
- 小谈多生成树协议--MSTP
- RabbitMQ (四)实现延迟消息
- MultiPoseNet:人体检测、姿态估计、语义分割一“网”打尽
- 企业网络推广专员浅析不同阶段下要有不同的企业网络推广方式
- 自定义IP原来如此简单
- Web页面减肥,慎用VS的自动格式化功能!
- Shell脚本之grep
- MySQL/MariaDB Tips
- 线性代数辅导讲义(第六章 二次型)
- 高等数学在计算机中的应用论文1500字,高等数学论文1500字_大一高等数学论文3000字_高等数学论文三千...
- linux 下bt远程下载,在Linux服务器上配置Transmission来离线下载BT种子
- python打印星号组成的三角形_Python利用for循环打印星号三角形的案例
- 转://Oracle 11gR2 硬件导致重新添加节点
- 2022年网站快速排名优化 方法是什么?
- libcurl简单接口的使用(FTP)
- 蓝桥杯嵌入式基于STM32G4的模块总结【HAL库】【省赛】
- 学大伟业 Day 3 培训总结
- IMS QTI 实践指南 | 01 简单题型 Simple Items