Android 蓝牙开发(一) – 传统蓝牙聊天室
Android 蓝牙开发(三) – 低功耗蓝牙开发
项目工程BluetoothDemo

上一章中,我们已经学习了传统蓝牙的开发,这一章,我们来学习如何让手机与蓝牙耳机、音箱等连接配对,并实现音频传输。

一、基础知识

前面在 Android 蓝牙开发(一) – 传统蓝牙聊天室 的文章中,我们已经对蓝牙知识有个基本认识。而且从 Android 3.0 开始,Bluetooth API 支持蓝牙配置文件,蓝牙配置文件是适用于设备间蓝牙通信的无线接口规范
举个例子:免提配置文件。如果手机要与无线耳机进行连接,则两台设备都必须支持免提配置文件。
而这一章中,我们要学习的就是 A2DP 配置文件

  • A2DP:蓝牙立体声音频传输配置文件 (A2DP) ,定义了如何通过蓝牙连接和流式传输,将高质量音频从一个设备传输至另一个设备。Android 提供 BluetoothA2dp 类,该类是用于控制蓝牙 A2DP 服务的代理。

同时,A2DP 也定义了两个角色:

  • Audio Source :(音频源) 音频的输入端对音频数据进行编码,发送到Sink端,一般指手机或者其他多媒体设备
  • Audio Sink : (音频接收器) 接收到音频数据后,进行解码操作还原出音频,常见为蓝牙音箱或耳机

二、连接设备

那么如何去连接一个蓝牙配置文件呢?你需要遵循以下几个步骤:

  1. 获取 BluetoothAdapter
  2. 设置 BluetoothProfile.ServiceListener,它会监听 BluetoothProfile 客户端连接到服务或断开服务时回调
  3. 通过 BluetoothAdapter 的 getProfileProxy() 方法,传入上面的BluetoothProfile.ServiceListener 和 BluetoothProfile.A2DP ,拿到 BluetoothA2dp 对象。
  4. 使用 BluetoothDevice 去配置或者直接连接
  5. 使用 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 蓝牙开发(二) --手机与蓝牙音箱配对,并播放音频相关推荐

  1. 【Android游戏开发二十七】讲解游戏开发与项目下的hdpi 、mdpi与ldpi资源文件夹以及游戏高清版本的设置...

    今天一个开发者问到我为什么游戏开发要删除项目下的hdpi.mdpi和ldpi文件夹:下面详细给大家解答一下: 首先童鞋们如果看过我写的<[Android游戏开发二十一]Android os设备谎 ...

  2. Google Maps API v2 android版本开发 国内手机不支持google play Service相关问题解决--图文教程

    Google Maps API v2 android版本开发 国内手机不支持google play Service相关问题解决--图文教程 参考文章: (1)Google Maps API v2 an ...

  3. Android画板开发(二) 橡皮擦实现

    Android画板开发(一) 基本画笔的实现 Android画板开发(二) 橡皮擦实现 Android画板开发(三) 撤销反撤销功能实现 Android画板开发(四) 添加背景和保存画板内容为图片 A ...

  4. 【Bluetooth蓝牙开发】一、蓝牙开发入门

    一.蓝牙开发入门 文章目录 一.蓝牙开发入门 1.蓝牙概念 2.蓝牙发展历程 3.蓝牙技术概述 3.1 Basic Rate(BR) 3.2 Low Energy(LE) 4.常见蓝牙架构 4.1 S ...

  5. Android蓝牙开发(一)蓝牙模块及核心API

    本文主要介绍Android蓝牙开发中基础知识:蓝牙模块及核心API. 关于蓝牙的连接及通讯功能实现,欢迎查阅下一篇文章:Android蓝牙开发(二)蓝牙消息传输实现. 蓝牙模块 从蓝牙4.0开始包含两 ...

  6. 【Android】蓝牙开发——BLE(低功耗蓝牙)(附完整Demo)

    目录 目录 前言 一.相关概念介绍 二.实战开发 三.项目演示 四.Demo案例源码地址 五.更新记录 1.2020/12/29 :修改 setupService()中错误 2.2021/05/14 ...

  7. Android蓝牙开发前序知识-经典蓝牙低功耗蓝牙区别

    最近从网上搜了(抄了)一些经典蓝牙和低功耗蓝牙的区别.关于蓝牙的大概了解,前文已经描述过了. Android中的蓝牙 说到Android中的蓝牙,大家听到的可能有蓝牙1.0.蓝牙2.0.蓝牙3.0.蓝 ...

  8. Android 蓝牙开发,申请打开蓝牙

    申请打开蓝牙 <!-- 蓝牙权限 --> <uses-permission android:name="android.permission.BLUETOOTH" ...

  9. nimble 蓝牙开发一:BLE 蓝牙 Host 规范概述

    目录 nimble 蓝牙开发一:概述 一.BLE 简介 二.BLE 基础知识 蓝牙设备地址 BLE 广播类型 标准广播数据 三.BLE 工作概述 BLE 常见的操作有: BLE 常见的工作流程: 四. ...

最新文章

  1. [Google API](6)拼写检查器和缓存页面
  2. paip.无线路由器的无线接入WAN方式WDS设置大法
  3. 小谈多生成树协议--MSTP
  4. RabbitMQ (四)实现延迟消息
  5. MultiPoseNet:人体检测、姿态估计、语义分割一“网”打尽
  6. 企业网络推广专员浅析不同阶段下要有不同的企业网络推广方式
  7. 自定义IP原来如此简单
  8. Web页面减肥,慎用VS的自动格式化功能!
  9. Shell脚本之grep
  10. MySQL/MariaDB Tips
  11. 线性代数辅导讲义(第六章 二次型)
  12. 高等数学在计算机中的应用论文1500字,高等数学论文1500字_大一高等数学论文3000字_高等数学论文三千...
  13. linux 下bt远程下载,在Linux服务器上配置Transmission来离线下载BT种子
  14. python打印星号组成的三角形_Python利用for循环打印星号三角形的案例
  15. 转://Oracle 11gR2 硬件导致重新添加节点
  16. 2022年网站快速排名优化 方法是什么?
  17. libcurl简单接口的使用(FTP)
  18. 蓝桥杯嵌入式基于STM32G4的模块总结【HAL库】【省赛】
  19. 学大伟业 Day 3 培训总结
  20. IMS QTI 实践指南 | 01 简单题型 Simple Items

热门文章

  1. tomcat配置https证书
  2. Codeforces 1139E(二分图最大匹配)
  3. 打一局王者荣耀比写一篇博客要容易的多!
  4. 【PostgreSQL】官网学习使用 PL/pgSQL编写造数据脚本
  5. SQLite.swift —— 实例教程(增删查改)Swift 3
  6. 期末大作业 | ToDoList网页设计 关于我界面设计记录
  7. MyBase 7.0 Desktop 30天破解
  8. 多元函数第八:连通性
  9. 一位底层工程师参加谷歌开发者大会后的感想
  10. matlab求因子载荷矩阵,Matlab因子分析