Android连接蓝牙打开SCO,实现蓝牙耳机输入

news/2024/11/9 5:11:02/

在很多应用中,都存在使用蓝牙进行录音。

首先我们写一个BroadcastReceiver,进行监听蓝牙状态改变。

public class BluetoothStatusRec extends BroadcastReceiver{private String TAG = "BluetoothStatusRec";public static AudioManager mAudioManager ;private TurnOffBtn mTurnOffBtn;public static boolean mIsScoEnable = false;public BluetoothStatusRec(TurnOffBtn ins){mTurnOffBtn = ins;}@Overridepublic void onReceive(Context context, Intent intent) {mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);mAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);if(intent.getAction() == BluetoothDevice.ACTION_ACL_CONNECTED){Log.d(TAG,"连接成功");mTurnOffBtn.turnOn();      mTurnOffBtn.changeBtn();context.registerReceiver(new BroadcastReceiver() {    //动态注册一个接受SCO状态改变的BroadcastReceiver@Overridepublic void onReceive(Context context, Intent intent) {int state = intent.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, -1);Log.d(TAG, "Audio SCO state: " + state);if (AudioManager.SCO_AUDIO_STATE_CONNECTED == state) {  //SCO打开后(由手机输入变为蓝牙耳机输入),进行录音mAudioManager.setBluetoothScoOn(true);context.unregisterReceiver(this);       //记得接收后解除注册//startRecord();     //进行录音,此时声源来自蓝牙耳机mTurnOffBtn.changeBtn();mTurnOffBtn.turnOn();Log.d("ww","连接sco成功");}else{try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}mAudioManager.startBluetoothSco();mTurnOffBtn.turnOff();mTurnOffBtn.changeBtnOn();}}}, new IntentFilter(AudioManager.ACTION_SCO_AUDIO_STATE_UPDATED));mAudioManager.startBluetoothSco();}if(intent.getAction() == BluetoothDevice.ACTION_ACL_DISCONNECTED){mTurnOffBtn.turnOff();mTurnOffBtn.changeBtnOn();}}public interface TurnOffBtn{void turnOff();void turnOn();void changeBtn();//连接蓝牙后禁用上面的start,stop按钮void changeBtnOn();//连接蓝牙后启用上面的start,stop按钮}}

然后在清单文件中声明这个BroadcastReceiver,

<receiver android:name="com.tanyaping.audio.blueRec.BluetoothStatusRec"><intent-filter><action android:name="BluetoothDevice.ACTION_ACL_CONNECTED" /><action android:name="BluetoothDevice.ACTION_ACL_DISCONNECTED" /></intent-filter></receiver>

这个蓝牙的广播(BluetoothStatusRec)也需要动态注册,

然后在清单文件中声明所需权限:

<uses-permission android:name="android.permission.BLUETOOTH"/><uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/><uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED"/><uses-permissionandroid:name="android.permission.MODIFY_AUDIO_SETTINGS" /><!-- 录音权限 --><uses-permission android:name="android.permission.RECORD_AUDIO" />
如果没有声明相应权限,耳机录音会失败。

http://www.ppmy.cn/news/752868.html

相关文章

【回溯算法Part04】| 93.复原IP地址、78.子集、90.子集||

目录 &#x1f388;LeetCode93.复原IP地址 &#x1f388;LeetCode78.子集 &#x1f388; LeetCode90.子集|| &#x1f388;LeetCode93.复原IP地址 链接&#xff1a;93.复原IP地址 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能…

备战秋招003(20230705)

文章目录 前言一、今天学习了什么&#xff1f;二、关于问题的答案1.原子性2.CAS3.Java内存模型4.volatile5.Redis 总结 前言 提示&#xff1a;这里为每天自己的学习内容心情总结&#xff1b; Learn By Doing&#xff0c;Now or Never&#xff0c;Writing is organized thinki…

Win10企业版本激活方法

右键管理员身份运行cmd&#xff0c;或者直接Win键X&#xff0c;直接打开Windows Powershell&#xff08;管理员&#xff09;&#xff0c;粘贴下面的命令即可。 slmgr /skms kms.03k.org slmgr /ato

win7 oem loader硬激活后如何卸载

打开cmd用管理员权限运行 slmgr -ipk New_Active_KEY &#xff1b;重新导入新的激活码来替换之前的硬激活

用OEM实现激活原理

OEM文件夹&#xff1a; O E M OEM OEM下有一个名为“** ∗ ∗ ” 的 子 文 件 夹 。 W i n d o w s 镜 像 安 装 过 程 &#xff0c; 在 W i n d o w s P E 阶 段 &#xff0c; 会 将 **”的子文件夹。Windows镜像安装过程&#xff0c;在Windows PE阶段&#xff0c;会将 ∗∗”…

OEM Certificate(OEM证书)介绍及浅析

OEM激活Windows 7需要三个条件&#xff0c;即SLIC 2.1、OEM证书、OEM密钥&#xff0c;上一篇介绍过SLIC的组成结构&#xff0c;现在我们来看一下OEM证书到底品貌如何&#xff0c;这个xrm-ms文件里头到底装载哪些宝藏呢&#xff0c;本文就来浅析一下&#xff0c;跟SLIC一样&…

微软OEM序列号探究

微软windows OEM序列号分为三大类&#xff1a;OEMSlp、OEMCoa和OemNonslp。 OEMSlp (System Locked Pre-installation)系统锁定的预装 这种key是OEM厂商预装系统使用的&#xff0c;slp key可以用来安装任何OEMSlip系统&#xff0c;和OEM的厂商无关。OEMSlp key不需要联网到微软…

批量授权、零售版和OEM的区别

http://jingyan.baidu.com/article/e8cdb32b61008437052badf0.html 批量授权、零售版和OEM的区别 当涉及到购买许可证&#xff08;license&#xff09;的问题&#xff0c;相信许多人都有过迷茫。不知道一些相应的license的问题。而购买license的渠道很多&#xff0c;那么我们应…