本篇文章主要介绍 A2DP 基础操作。

  • 介绍

A2DP :Advanced Audio Distribution Profile。高质量音频数据传输的协议,其定义里了传送单声道或立体声等高质量音频(区别于蓝牙SCO链路上传输的普通语音)信息的协议和过程。A2DP的典型应用是将音乐播放器的音频数据发送到耳机或音箱。

A2DP 定义了两种角色:

Audio Source :(音频源) 音频的输入端对音频数据进行编码,发送到Sink端。
Audio Sink :     (音频接收器) 接收到音频数据后,进行解码操作还原出音频。

  • 初始化 A2DP 代理对象
  private void initBluetooth() {mBtAdapter = BluetoothAdapter.getDefaultAdapter();if (!mBtAdapter.isEnabled()) {return;}//获取A2DP代理对象mBtAdapter.getProfileProxy(mContext, mListener, BluetoothProfile.A2DP);}private void initReceiver() {//广播接收者监听状态IntentFilter filter = new IntentFilter(BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED);filter.addAction(BluetoothA2dp.ACTION_PLAYING_STATE_CHANGED);mContext.registerReceiver(mReceiver, filter);}
  • 初始化 A2DP 代理对象
  private void initBluetooth() {mBtAdapter = BluetoothAdapter.getDefaultAdapter();if (!mBtAdapter.isEnabled()) {return;}//获取A2DP代理对象mBtAdapter.getProfileProxy(mContext, mListener, BluetoothProfile.A2DP);}private void initReceiver() {//广播接收者监听状态IntentFilter filter = new IntentFilter(BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED);filter.addAction(BluetoothA2dp.ACTION_PLAYING_STATE_CHANGED);mContext.registerReceiver(mReceiver, filter);}
  • 广播接收者,获取连接状态
private BroadcastReceiver mReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();//A2DP连接状态改变if (action != null) {if (action.equals(BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED)) {int state = intent.getIntExtra(BluetoothA2dp.EXTRA_STATE, BluetoothA2dp.STATE_DISCONNECTED);callBackA2dpConnectState(state);} else if (action.equals(BluetoothA2dp.ACTION_PLAYING_STATE_CHANGED)) {//A2DP播放状态改变int state = intent.getIntExtra(BluetoothA2dp.EXTRA_STATE, BluetoothA2dp.STATE_NOT_PLAYING);Log.i(TAG, "play state=" + state);}}}};
  • 获取 A2DP 代理对象 proxy
  private BluetoothProfile.ServiceListener mListener = new BluetoothProfile.ServiceListener() {@Overridepublic void onServiceDisconnected(int profile) {Log.i(TAG, "onServiceDisconnected profile=" + profile);if (profile == BluetoothProfile.A2DP) {mA2dp = null;}}@Overridepublic void onServiceConnected(int profile, BluetoothProfile proxy) {Log.i(TAG, "onServiceConnected profile=" + profile);if (profile == BluetoothProfile.A2DP) {mA2dp = (BluetoothA2dp) proxy; //转换if (onBluetoothA2dpReadyListener != null) {onBluetoothA2dpReadyListener.onBluetoothA2dpReady();}}}};
  • 连接

a2dp connect is hide  需要通过反射获取,连接成功之后,可以在蓝牙设备中播放音乐等音频

   public void connectA2dp(BluetoothDevice device) {Log.i(TAG, "connect to device :" + device);mConnectDevice = device;setPriority(device, 100); //设置prioritytry {//通过反射获取BluetoothA2dp中connect方法(hide的),进行连接。Method connectMethod = BluetoothA2dp.class.getMethod("connect",BluetoothDevice.class);connectMethod.invoke(mA2dp, device);} catch (Exception e) {e.printStackTrace();}}
  • 断开连接
 public void disConnectA2dp(BluetoothDevice device) {mConnectDevice = null;setPriority(device, 0);try {//通过反射获取BluetoothA2dp中connect方法(hide的),断开连接。Method connectMethod = BluetoothA2dp.class.getMethod("disconnect",BluetoothDevice.class);connectMethod.invoke(mA2dp, device);} catch (Exception e) {e.printStackTrace();}}
  • 设置优先级,一般 priority = 100
    public void setPriority(BluetoothDevice device, int priority) {if (mA2dp == null) return;try {//通过反射获取BluetoothA2dp中setPriority方法(hide的),设置优先级Method connectMethod = BluetoothA2dp.class.getMethod("setPriority",BluetoothDevice.class, int.class);connectMethod.invoke(mA2dp, device, priority);} catch (Exception e) {e.printStackTrace();}}

好了,到这里相信大家都明白了,HFP 和 A2DP 的操作流程基本一样。

Android 蓝牙基础篇之 —— A2DP相关推荐

  1. Android 蓝牙基础篇之 —— SPP

    蓝牙通讯协议有两种: GATT 和 SPP 之前已经介绍了 BLE 是如何进行简单的通讯,现在介绍 SPP 具体的方法. 连接 // 取消所有正在连接/已经连接的线程,然后重新建立连接 public ...

  2. Android日志[基础篇]Android Log日志输出

    Android日志[基础篇]二 Android Studio修改LogCat日志的颜色 android.util.Log输出日志的常用方法如下: Log.v(String tag, String ms ...

  3. Android 蓝牙 与wifi共存 A2dp 播放音乐卡音问题处理

    android-蓝牙A2dp-avrcp-hfp-opp-配对流程-ble-rfcomm源码流程 Android 蓝牙A2dp-Avrcp初始化-连接-播放源码分析文档大全-点击下载 Wifi共存-- ...

  4. android 蓝牙基础

    Android 4.2蓝牙介绍 蓝牙一词源于公元十世纪丹麦国王HaraldBlatand名字中的Blatand.Blatand的英文之意就是Blue tooth.这是因为这位让丹麦人引以为傲的国王酷爱 ...

  5. Android日志[基础篇]二 Android Studio修改LogCat日志的颜色

    上一篇提到Android日志的5个级别的日志输出,在logcat里面设置自己喜欢或习惯的颜色,本文不只讲Android Sudio修改logcat的日志颜色. 代码和效果 代码 private voi ...

  6. 蓝牙-基础篇-蓝牙简介

    文章目录 蓝牙特点 蓝牙功能 蓝牙的两种技术 蓝牙特点 低功耗 短距离 跨设备 蓝牙功能 跨设备传输流式音频 跨设备传输数据 广播信息 蓝牙的两种技术 传统蓝牙技术(蓝牙版本2.0/2.1):即Bas ...

  7. 【Android】基础篇:Android中TextView控件学习

    大家好,我是皮皮猫吖. 每文一言: 我不去想是否能够成功,既然选择了远方,便只顾风雨兼程. 本篇文章: 主要是关于TextView控件的学习. 正文如下: 根据TextView控件进行如下相关操作 案 ...

  8. android滑动基础篇 TouchView

    效果图: 代码部分: activity类代码: package com.TouchView; import android.app.Activity; import android.os.Bundle ...

  9. android peopleactivity.java,Android面试基础篇---Activity(上)

    ** 前言: ** 一.生命周期 1.七个方法: 1.1:onCreate() 在这里创建界面,做一些数据的初始化工作 1.2:onStart() 可见不可交互 1.3:onResume() 可见可交 ...

最新文章

  1. 零下273.14度稳定运行!中科院自主研发稀释制冷机,高端科研仪器取得突破进展...
  2. 史上最详细“截图”搭建Hexo博客——For Windows
  3. 使用BootStrap制作用户登录UI
  4. 沈阳大学计算机系教师,张春芳(信息工程学院)老师 - 沈阳大学 - 院校大全
  5. jvm在windows和linux,理解JVM如何使用Windows和Linux上的本机内存
  6. tensorflow2调用huggingface transformer预训练模型
  7. 第四十三期:2020年企业面临的20大数据安全风险
  8. HTC公布多款Android新机系统内核源代码
  9. 学习C语言编程,推荐你看这6本书
  10. python pyodbc mysql,【python】 pyodbc连接mysql
  11. 计算机论文有哪些方向,计算机论文研究方向有以下四类
  12. Spring框架基础(2)----Bean的创建及标签属性
  13. java double 类型_关于Java中的double类型数据
  14. 【20保研】清华大学深圳国际研究生院电子信息工程(信息技术) 2019年优秀大学生暑期夏令营通知...
  15. hexo添加valine评论系统 (yilia主题)
  16. 8个经典数据分析模型
  17. 网站内页移动适配Meta标注声明 (DEDE 版)
  18. [TITANX × 4]在服务器上运行darknet/YOLOv3
  19. vscode使用备忘
  20. vue路由当中的导航钩子中关于next这个方法的描述应该如何理解?

热门文章

  1. 治理:没有规矩不成方圆
  2. 算法训练 黑色星期五
  3. 【夜晚安静的享受】只想安静下来
  4. 暑期总结——变是永远不变的
  5. 从大脑中汲取灵感,能效提高了1000倍,新芯片拓展AI的可能性
  6. 分众无线MSN强强联手 引发无线营销新热潮
  7. 收藏:一个不错的关于设计师考核的标准
  8. 教育部:不建议占用假期来补课
  9. 使用CSS渐变制作进度条
  10. 指标详解(5)-- 布林线指标(BOLL)详解