#Android 实现蓝牙录音

本文实现使用AudioRecord 来进行蓝牙录音。

主要是通过打开蓝牙SCO通路实现。

这里不考虑连接蓝牙问题,要确保蓝牙连接成功。

app的界面

实现功能:普通录音、停止、播放和蓝牙录音、停止、播放。

具体的实现过程:

这里封装了打开SCO的工具类。

先是打开SCO通道后进行蓝牙录音。

使用AudioRecord 来进行蓝牙录音。

使用AudioTrack 来进行播放。

下面是打开SCO的工具类:

package com.recorder.huawei.recorderdemo;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.content.IntentFilter;

import android.media.AudioManager;

import android.support.annotation.NonNull;

import android.util.Log;

public class BluetoothUtil {

private String TAG = "BluetoothUtil";

private static BluetoothUtil mBluetoothUtil;

//第一次打开sco没成功的情况,持续连接的次数

private static final int SCO_CONNECT_TIME = 5;

private int mConnectIndex = 0;

private AudioManager mAudioManager = null;

static Context mContext;

private BluetoothUtil() {

if (mAudioManager == null) {

mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);

}

}

public static BluetoothUtil getInstance(Context context) {

mContext = context;

if (mBluetoothUtil == null) {

mBluetoothUtil = new BluetoothUtil();

}

return mBluetoothUtil;

}

public void openSco(@NonNull final IBluetoothConnectListener listener) {

if (!mAudioManager.isBluetoothScoAvailableOffCall()) {

Log.e(TAG, "系统不支持蓝牙录音");

listener.onError("Your device no support bluetooth record!");

return;

}

new Thread(new Runnable() {

@Override

public void run() {

//mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);

//蓝牙录音的关键,启动SCO连接,耳机话筒才起作用

mAudioManager.stopBluetoothSco();

mAudioManager.startBluetoothSco();

//蓝牙SCO连接建立需要时间,连接建立后会发出ACTION_SCO_AUDIO_STATE_CHANGED消息,通过接收该消息而进入后续逻辑。

//也有可能此时SCO已经建立,则不会收到上述消息,可以startBluetoothSco()前先

//stopBluetoothSco()

mConnectIndex = 0;

mContext.registerReceiver(new BroadcastReceiver() {

@Override

public void onReceive(Context context, Intent intent) {

int state = intent.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, -1);

boolean bluetoothScoOn = mAudioManager.isBluetoothScoOn();

Log.i(TAG, "onReceive state=" + state + ",bluetoothScoOn=" + bluetoothScoOn);

if (AudioManager.SCO_AUDIO_STATE_CONNECTED == state) { // 判断值是否是:1

Log.e(TAG, "onReceive success!");

mAudioManager.setBluetoothScoOn(true); //打开SCO

listener.onSuccess();

mContext.unregisterReceiver(this); //取消广播,别遗漏

} else {//等待一秒后再尝试启动SCO

Log.e(TAG, "onReceive failed index=" + mConnectIndex);

try {

Thread.sleep(500);

} catch (InterruptedException e) {

e.printStackTrace();

}

if (mConnectIndex < SCO_CONNECT_TIME) {

mAudioManager.startBluetoothSco();//再次尝试连接

} else {

listener.onError("open sco failed!");

mContext.unregisterReceiver(this); //取消广播,别遗漏

}

mConnectIndex++;

}

}

}, new IntentFilter(AudioManager.ACTION_SCO_AUDIO_STATE_UPDATED));

}

}).start();

}

public void closeSco() {

boolean bluetoothScoOn = mAudioManager.isBluetoothScoOn();

Log.i(TAG, "bluetoothScoOn=" + bluetoothScoOn);

if (bluetoothScoOn) {

mAudioManager.setBluetoothScoOn(false);

mAudioManager.stopBluetoothSco();

}

mBluetoothConnectListener = null;

}

public interface IBluetoothConnectListener {

void onError(String error);

void onSuccess();

}

IBluetoothConnectListener mBluetoothConnectListener;

}

之前上网查了几个资料,好几个都不好使,

有的是直接设置几个参数,那样是肯定不行的。

后面发现通过打开sco通道的方式可以进行蓝牙录音!

进行蓝牙录音要确保权限通过,蓝牙是动态权限,

还有一个是打开sco的重要权限,一定要在AndroidManafest中声明。

下面是蓝牙录音存储相关的权限:

后面在评论区会附带源码和apk文件。

#共勉:你一直在等,所以你一事无成。

android 蓝牙 录音,Android 实现蓝牙录音相关推荐

  1. Android底层开发之旅—蓝牙系统分析

    2019独角兽企业重金招聘Python工程师标准>>> Android蓝牙系统分为四个层次,内核层.BlueZ库.BlueTooth的适配库.BlueTooth的JNI部分.Java ...

  2. android 动态录音权限,Android如何判断手机是否有录音权限的工具类

    作用 判断手机是否有录音权限的工具类,兼容6.0以上以及以下android系统 测试环境 这篇文章是评论中的网友提出质疑后,经过重写修改与重写测试后编写的,我的调试环境是小米note3,Android ...

  3. android ble从设备,从Android设备发送命令到蓝牙

    我发现命令从我的Android设备发送到蓝牙设备. 蓝牙与微控制器相关联.我的努力如下: public class MainActivity extends AppCompatActivity { p ...

  4. 实现Android和PC之间的蓝牙通信

    这两天想实现PC和安卓手机的通信,限于水平,知道的方法大概有两种:基于数据包的socket和蓝牙.虽然看起来简单,但调也调了两天多.自己测试了下socket,在室内WIFI环境下时延大概是0.1s.而 ...

  5. android 蓝牙通讯实现手机蓝牙的开启,并扫描附近可见的蓝牙设备

    蓝牙是一种重要的短距离无线通信协议,广泛应用于各种设备(手机,医疗,汽车等).蓝牙是比较常用的无线通信设备,早研究成为手机的标配.现在的安卓手机基本上都有蓝牙,所有通过蓝牙对数据有很好的硬件基础 在A ...

  6. android service 样例(电话录音和获取系统当前时间)

    关于android service 的具体解释请參考: android四大组件--android service具体解释.以下将用两个实例具体呈现Android Service的两种实现. 一个是st ...

  7. android spp协议,Android蓝牙开发SPP协议通信

    最近项目中使用到蓝牙SPP协议通信,然后在网上看了很多资料,进行学习使用,为了加深印象,做个简单的整理. 1.使用蓝牙权限< uses-permission android:name=" ...

  8. Android 9.0 蓝牙功能之一:蓝牙音乐

    Android 9.0 蓝牙功能之一:蓝牙音乐 本章节记录如何构建蓝牙音乐. 文章目录 Android 9.0 蓝牙功能之一:蓝牙音乐 主要流程 相关代码 其他要点: 蓝牙AG_EVENT广播 (手机 ...

  9. Android蓝牙开发系列文章-蓝牙设备类型知多少?

    在写<Android蓝牙开发系列文章-蓝牙音箱连接>时,计划细化出一篇讲解蓝牙设备类型的文章,现在它来了~ 阅读其他内容,可以点击<Android蓝牙开发系列文章-策划篇>,或 ...

  10. android系统源码学习 -- 蓝牙 bluetooth (一) 入门

    原文地址:http://blog.csdn.net/baimy1985/article/details/8892410 1. 代码分布: packages/apps/Bluetooth/ 看这路径肯定 ...

最新文章

  1. 基于Gitflow分支模型自动化Java项目工作流
  2. Opencv读取图片像素值
  3. Windows Mobile与OPhone开发对比
  4. Matlab调用Java类访问数据库
  5. 关于logrotate工具的日志切割
  6. Linux下安装Elasticsearch2.x
  7. Jdk1.8新特性(三)——方法引用::
  8. 想入门平均月薪2.58w人工智能领域?看看BAT的工程师在学什么
  9. java被电脑阻止怎么办_学电脑,一定要记住的6个常用命令,它能让你快速成为电脑达人...
  10. Property or method “id“ is not defined on the instance but referenced during render.Make sure ......
  11. 机器学习实战:基于概率论的分类方法:朴素贝叶斯(源码解析,错误分析)...
  12. Ubuntu20设置蓝牙
  13. 【读书笔记->统计学】12-02 置信区间的构建-t分布概念简介
  14. C#调用三菱的MX Component控件与三菱PLC进行通讯
  15. 矩阵卷积运算的具体过程,很简单
  16. 程序员就该这么悲催么? 996下的我们何去何从
  17. mac开发者身份_如何以开发者的身份环游世界
  18. 电阻、电容及电感的高频等效电路及特性曲线
  19. pandas关键字提取_使用NLP从文章中自动提取关键字
  20. 关于C++vector容器内使用reserve函数预留能否被覆盖的问题

热门文章

  1. 材料成型与控制专业和计算机专业,材料成型及控制工程专业
  2. cx oracle 中文 u,cx_Oracle 中文乱码
  3. 安卓 apk反编译教程
  4. 【UE·蓝图】UE4蓝图MediaPlayer注意事项
  5. android开发 手写签名,Android实现手写签名
  6. FCM算法的matlab实现(Fuzzy C-means 算法)
  7. html的个人简历边框,怎样制作简历模板边框
  8. Matlab 绘制风速、风向统计玫瑰花图
  9. php调用手写板,在Linux操作系统中使用手写板
  10. android 金山电池医生,金山电池医生3.0(android版).PDF