Android 蓝牙开发(二)

您所在的位置:网站首页 手机蓝牙无法连接媒体音频 Android 蓝牙开发(二)

Android 蓝牙开发(二)

2024-07-09 10:30:40| 来源: 网络整理| 查看: 265

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) { //拿到 BluetoothA2dp bluetoothA2dp = 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~30 socket = 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 已经帮我们实现好了。

当然,如果你想自己编码且传输数据,再进行解码也是可以的,自己去搞吧。。。

下一章,我们将学习低功耗蓝牙



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭