android 蓝牙 录音,Android 实现蓝牙录音
#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 实现蓝牙录音相关推荐
- Android底层开发之旅—蓝牙系统分析
2019独角兽企业重金招聘Python工程师标准>>> Android蓝牙系统分为四个层次,内核层.BlueZ库.BlueTooth的适配库.BlueTooth的JNI部分.Java ...
- android 动态录音权限,Android如何判断手机是否有录音权限的工具类
作用 判断手机是否有录音权限的工具类,兼容6.0以上以及以下android系统 测试环境 这篇文章是评论中的网友提出质疑后,经过重写修改与重写测试后编写的,我的调试环境是小米note3,Android ...
- android ble从设备,从Android设备发送命令到蓝牙
我发现命令从我的Android设备发送到蓝牙设备. 蓝牙与微控制器相关联.我的努力如下: public class MainActivity extends AppCompatActivity { p ...
- 实现Android和PC之间的蓝牙通信
这两天想实现PC和安卓手机的通信,限于水平,知道的方法大概有两种:基于数据包的socket和蓝牙.虽然看起来简单,但调也调了两天多.自己测试了下socket,在室内WIFI环境下时延大概是0.1s.而 ...
- android 蓝牙通讯实现手机蓝牙的开启,并扫描附近可见的蓝牙设备
蓝牙是一种重要的短距离无线通信协议,广泛应用于各种设备(手机,医疗,汽车等).蓝牙是比较常用的无线通信设备,早研究成为手机的标配.现在的安卓手机基本上都有蓝牙,所有通过蓝牙对数据有很好的硬件基础 在A ...
- android service 样例(电话录音和获取系统当前时间)
关于android service 的具体解释请參考: android四大组件--android service具体解释.以下将用两个实例具体呈现Android Service的两种实现. 一个是st ...
- android spp协议,Android蓝牙开发SPP协议通信
最近项目中使用到蓝牙SPP协议通信,然后在网上看了很多资料,进行学习使用,为了加深印象,做个简单的整理. 1.使用蓝牙权限< uses-permission android:name=" ...
- Android 9.0 蓝牙功能之一:蓝牙音乐
Android 9.0 蓝牙功能之一:蓝牙音乐 本章节记录如何构建蓝牙音乐. 文章目录 Android 9.0 蓝牙功能之一:蓝牙音乐 主要流程 相关代码 其他要点: 蓝牙AG_EVENT广播 (手机 ...
- Android蓝牙开发系列文章-蓝牙设备类型知多少?
在写<Android蓝牙开发系列文章-蓝牙音箱连接>时,计划细化出一篇讲解蓝牙设备类型的文章,现在它来了~ 阅读其他内容,可以点击<Android蓝牙开发系列文章-策划篇>,或 ...
- android系统源码学习 -- 蓝牙 bluetooth (一) 入门
原文地址:http://blog.csdn.net/baimy1985/article/details/8892410 1. 代码分布: packages/apps/Bluetooth/ 看这路径肯定 ...
最新文章
- 基于Gitflow分支模型自动化Java项目工作流
- Opencv读取图片像素值
- Windows Mobile与OPhone开发对比
- Matlab调用Java类访问数据库
- 关于logrotate工具的日志切割
- Linux下安装Elasticsearch2.x
- Jdk1.8新特性(三)——方法引用::
- 想入门平均月薪2.58w人工智能领域?看看BAT的工程师在学什么
- java被电脑阻止怎么办_学电脑,一定要记住的6个常用命令,它能让你快速成为电脑达人...
- Property or method “id“ is not defined on the instance but referenced during render.Make sure ......
- 机器学习实战:基于概率论的分类方法:朴素贝叶斯(源码解析,错误分析)...
- Ubuntu20设置蓝牙
- 【读书笔记->统计学】12-02 置信区间的构建-t分布概念简介
- C#调用三菱的MX Component控件与三菱PLC进行通讯
- 矩阵卷积运算的具体过程,很简单
- 程序员就该这么悲催么? 996下的我们何去何从
- mac开发者身份_如何以开发者的身份环游世界
- 电阻、电容及电感的高频等效电路及特性曲线
- pandas关键字提取_使用NLP从文章中自动提取关键字
- 关于C++vector容器内使用reserve函数预留能否被覆盖的问题
热门文章
- 材料成型与控制专业和计算机专业,材料成型及控制工程专业
- cx oracle 中文 u,cx_Oracle 中文乱码
- 安卓 apk反编译教程
- 【UE·蓝图】UE4蓝图MediaPlayer注意事项
- android开发 手写签名,Android实现手写签名
- FCM算法的matlab实现(Fuzzy C-means 算法)
- html的个人简历边框,怎样制作简历模板边框
- Matlab 绘制风速、风向统计玫瑰花图
- php调用手写板,在Linux操作系统中使用手写板
- android 金山电池医生,金山电池医生3.0(android版).PDF