专栏首页编程思想之路Android蓝牙连接a2dp蓝牙耳机

Android蓝牙连接a2dp蓝牙耳机

开发环境:

开发工具:Androidstudio 适配机型:honor8(Android6.0), 坚果R1(Android8.0) 开发功能:Android中蓝牙连接A2DP设备,蓝牙耳机设备

功能实现:

本应用提供以下功能: 第一:开启蓝牙 第二:查找过滤掉A2DP设备 第三:连接A2DP设备 第四:断开连接A2DP设备 第五:保存通过本应用连接的A2DP设备 第六:当重新启动应用时加载已连接的设备

A2dp介绍

A2DP全名是Advanced Audio Distribution Profile 蓝牙音频传输模型协定。 A2DP是能够采用耳机内的芯片来堆栈数据,达到声音的高清晰度。然而并非支持A2DP的耳机就是蓝牙立体声耳机,立体声实现的基本要求是双声道,所以单声道的蓝牙耳机是不能实现立体声的。声音能达到44.1kHz,一般的耳机只能达到8kHz。如果手机支持蓝牙,只要装载A2DP协议,就能使用A2DP耳机了。还有消费者看到技术参数提到蓝牙V1.0 V1.1 V1.2 V2.0——这些是指蓝牙的技术版本,是指通过蓝牙传输的速度,他们是否支持A2DP具体要看蓝牙产品制造商是否使用这个技术

代码介绍

代码结构如下 ![在这里插入图片描述](http://www.demodashi.com/contentImages/image/20181206/mB4Q16mLDbNGEwY1dNa.png)

本应用共包含五个java文件: Constants:常量值定义文件 Utils:工具类,包含log包装,toast包装,以及sharedpreference的包装 DeviceBean:封装BluetoothDevice, 包含device信息 DeviceListAdapter:ListView的适配器,其中有对list列表,按钮点击事件的处理 DeviceListActivity:应用中的唯一UI界面

其中readMe为说明文件

开启蓝牙代码: 向系统发送请求,开启蓝牙,该过程会请求用户同意开启蓝牙

Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

接下来开启蓝牙扫描,

btAdapter.startDiscovery();

在扫描过程中过滤掉非A2DP的设备

if (btClass.getMajorDeviceClass() != BluetoothClass.Device.Major.AUDIO_VIDEO) { /**本demo只处理a2dp设备,所以只显示a2dp,过滤掉其他设备*/ break; }

之后点击界面的connect按钮连接对应设备

Method method = BluetoothA2dp.class.getMethod("connect", new Class[]{BluetoothDevice.class}); method.invoke(bluetoothA2dp, device);

在连接成功后可以断开对应设备

Method method = BluetoothA2dp.class.getMethod("disconnect", new Class[]{BluetoothDevice.class}); method.invoke(bluetoothA2dp, device);

当应用退出或者进程被杀死后,重新进入应用时会加载原先已连接的蓝牙设备。

  /**
     * 获取到保存的a2dp连接
     * @param context
     * @return
     */
    static DeviceBean fetchConnectedDevice(Context context){
        DeviceBean deviceBean = null;
        SharedPreferences sharedPreferences = context.getSharedPreferences(
                Constants.PREF_CONNECTED_DEVICE, Context.MODE_PRIVATE);
        String name = sharedPreferences.getString(Constants.PREF_DEVICE_NAME, null);
        String address = sharedPreferences.getString(Constants.PREF_DEVICE_ADDRESS, null);
        if (address != null) {
            deviceBean = new DeviceBean();
            deviceBean.setName(name == null ? address : name);
            deviceBean.setAddress(address);
            deviceBean.setState(BluetoothAdapter.STATE_CONNECTED);
        }
        return deviceBean;
    }

断开设备:

/**
     * 断开当前a2dp设备
     *
     * @param device device
     */
    private void disconnectA2dp(BluetoothDevice device) {
        if (bluetoothA2dp == null || device == null) {
            return;
        }
        try {
            Method method = BluetoothA2dp.class.getMethod("disconnect", new Class[]{BluetoothDevice.class});
            method.invoke(bluetoothA2dp, device);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
            Utils.logE(TAG, e.getMessage());
        } catch (InvocationTargetException e) {
            e.printStackTrace();
            Utils.logE(TAG, e.getMessage());
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
            Utils.logE(TAG, e.getMessage());
        }
    }

具体代码参考源码,谢谢。

备注,加载已连接的蓝牙设备是只针对该应用,也就是说只加载在该应用中进行连接的设备,对于通过设置连接的设备,不做处理。

本应用只是提供一个雏形,更多功能需求还需要自己去完善

功能演示

开启蓝牙 ![在这里插入图片描述](http://www.demodashi.com/contentImages/image/20181206/qDfU05rYv27nhTf9D6s.png)

开启扫描并过滤扫描结果

发起连接,在发起连接时,系统会自动为其进行配对操作

连接成功显示

在杀死应用或者重启手机,重新进入应用时依旧可以看到已连接的设备

Demo下载地址

[Demo下载地址](http://www.demodashi.com/demo/14624.html)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 程序员经常访问的技术网站

    (1).Github 代码托管 GitHub的使用可是程序员在职业生涯中技能必不可少的技能。它可以做Git代码托管平台,很多开源项目都放在Github上,因此...

    honey缘木鱼
  • Text store debug FM CRM_TEXT_MAINTAIN_OW

    Jerry Wang
  • Android基础知识:项目架构基础概述

    前段时间由于工作需要,学习了关于组件化和插件化架构相关的知识。查阅了很多Android开发架构的资料,组件化自己写了个简单的Demo并且开始了原有项目的改造,插...

    Android技术干货分享
  • Android必知必会-获取View坐标和长宽的时机

    版权声明:本文为[他叫自己Mr.张]的原创文章,转载请...

    他叫自己MR.张
  • android安卓应用和OBD的集成场景

    Jerry Wang
  • SpringMVC的工作原理图

    2、  DispatcherServlet收到请求调用HandlerMapping处理器映射器。

    凯哥Java
  • 经验分享:微信小程序外包接单常见问题及流程

    从九月底内测到现在已经三个半月.凌晨一点睡觉已经习以为常,也正是这样,才让无前端经验的我做微信小程序开发并不感到费劲. 最近才开始接微信小程序的外包项目,目前已...

    凯哥Java
  • 2. Jetpack源码解析---Navigation为什么切换Fragment会重绘?

    Jetpack组件之Navigation—看完你就知道Navigation是什么了?

    Hankkin
  • SpringMVC常见面试题总结(超详细回答)

    Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,Controller分离,将web层进...

    程序员小强
  • 程序员笔记——通过OpenGL理解前端渲染原理(1)

    OpenGL,是一套绘制3D图形的API,当然它也可以用来绘制2D的物体。OpenGL有一大套可以用来操作模型和图片的函数,通常编写OpenGL库的人是显卡的制...

    宜信技术学院

扫码关注云+社区

领取腾讯云代金券