如何通过蓝牙麦克风录制音频

2024-03-08

我正在尝试通过蓝牙耳机麦克风录制音频,但我只能听到音频,但无法通过蓝牙麦克风录制音频,而是可以从移动麦克风录制语音。

我正在使用下面的代码

IntentFilter newintent = new IntentFilter();
newintent.addAction(AudioManager.ACTION_SCO_AUDIO_STATE_UPDATED);
mContext.registerReceiver(mSCOHeadsetAudioState, newintent);

AudioManager mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
mAudioManager.setBluetoothScoOn(true);
mAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
mAudioManager.startBluetoothSco();

private final BroadcastReceiver mSCOHeadsetAudioState = new BroadcastReceiver() {

    public void onReceive(Context context, Intent intent) {

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

        if (state == AudioManager.SCO_AUDIO_STATE_CONNECTED) {
            DisplayToast("BT Recording is Ready");

            onRecord();

        } else if (state == AudioManager.SCO_AUDIO_STATE_DISCONNECTED) {
            DisplayToast("BT Recording Disabled");              

        }
    }
};

public void onRecord(){     

    String mFilename = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath();
    String mBTFileName = mFilename + "/BTRecord.3gp";

    final RecordThread BT = new RecordThread(false,mBTFileName);


    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);

    // set title
    alertDialogBuilder.setTitle("Alert");

    // set dialog message
    alertDialogBuilder
        .setMessage("Recording...")
        .setCancelable(false)
        .setNeutralButton("Stop",new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog,int id) {
                // if this button is clicked, stop recording
                BT.stopRecording();
                mAudioManager.stopBluetoothSco();
                // To do: start separation and play back here

                dialog.dismiss();
            }
        });

    try{
        BT.prepareRecording();
    }catch(Exception e){
        Toast.makeText(this, "Recording prepare failed", Toast.LENGTH_SHORT).show();
        BT.stopRecording();
        this.finish();
    }
    try{
        mAudioManager.stopBluetoothSco();
        BT.start(); //Try to minimize delay here some how...
    }catch(Exception e){
        Toast.makeText(this, "Recording failed", Toast.LENGTH_SHORT).show();
        Log.e(LOG_TAG, "Record failed");
        BT.stopRecording();
        mAudioManager.stopBluetoothSco();
        this.finish();
    }           

    // create alert dialog
    alertDialog = alertDialogBuilder.create();

    // show it
    alertDialog.show();

}

final class RecordThread extends Thread implements Runnable{

    public String mFile;
    protected boolean isBT;

    private Camera access;
    private MediaRecorder mRecorder;
    private static final String LOG_TAG = "Recording thread";

    public RecordThread(boolean isBT, String file){
        this.isBT = isBT;
        this.mFile = file;
    }
    @Override
    public void run() throws RuntimeException{

        try{
            this.mRecorder.start();
        }catch(Exception e){
            Log.e(LOG_TAG,"Run Method Exception");
            RuntimeException re = new RuntimeException();
            throw re;
        }

    }
    public void prepareRecording() throws Exception{
        this.mRecorder = new MediaRecorder();
        this.mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        this.mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        this.mRecorder.setOutputFile(mFile);
        this.mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);

        try {
            this.mRecorder.prepare();
        } catch (IOException e) {
            Log.e(LOG_TAG, "prepare() failed");
            if(access != null){
                access.release();
            }
            throw e;
        }        
    }   

    public void stopRecording() {
        if(access != null){
            access.release();
        }
        try{
            mRecorder.stop();
            mRecorder.release();
            mRecorder = null;
        }catch(Exception e){        
            mRecorder = null;
        }
    }
}

try

.setMode(AudioManager.MODE_IN_CALL);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过蓝牙麦克风录制音频 的相关文章

随机推荐

  • 如何通过revit API访问所有族类型?

    是否可以使用 Revit API 访问特定类别 例如窗户 门等 的所有族类型 与实例相反 据我所知 使用 FilteredElementCollector doc OfCategory ToElements 或 FilteredElemen
  • 根据输入字段的值更改文本颜色或背景[重复]

    这个问题在这里已经有答案了 可能的重复 如何使用 Javascript 更改背景颜色 https stackoverflow com questions 197748 how do i change the background color
  • CQRS - 如何对场景执行系统进行建模

    我最近开始为我即将启动的一个绿地项目研究 CQRS 和 DDD 我研究了 Udi Dahan Greg Young Mark Nijhof 等人的大量资料 这些确实非常有帮助 我想我对这些概念有了很好的理解 但是 我仍然有一些关于如何将这些
  • Android:如何将 ActionBar“Home”图标更改为应用程序图标以外的其他图标?

    我的应用程序的主图标在一张图像中由两部分组成 一个徽标和其下方的几个字母 这对于应用程序的启动器图标效果很好 但是当图标出现在 ActionBar 的左边缘时 字母会被切断 看起来不太好 我想为 ActionBar 提供一个单独版本的图标
  • 笨拙地计算一组递增数字之间的差异,有更漂亮的方法吗?

    下面的代码工作得很好 但看起来很冗长 肯定有更优雅的方法来计算这个吗 我的想法是 我有一个包含 100 个递增时间戳的列表 我想查看这些时间戳并计算每个时间戳之间的平均时间 下面的代码可以运行 但我确信像这样反转列表确实效率很低 有什么建议
  • 替换除正数/负数之外的所有内容

    对于替换所有正数 许多问题已经得到解答 但是 我找不到任何保留正数和负数的答案 我想替换所有非数字 正数或负数 的内容 输出应如下所示 例如 0 success id 1234 gt 0 1234 and 10 failure id 234
  • Composer 从同一存储库上的另一个分支拉取依赖项

    我有以下 Composer 1 6 5 设置 require CRMPicco GolfBundle dev golf bundle repositories type git url email protected cdn cgi l e
  • 使用 VB.NET 的秒表循环

    我想使用 VB NET 创建一个带有此接口的简单计时器 我想按 Button1 并开始在文本框中计算秒数 我不想使用计时器组件 因为它不提供高分辨率 https stackoverflow com questions 10470276 my
  • 如何使用Content Provider实现复杂的查询?

    我问这个问题是因为我不太确定如何与 Android 内容提供商合作 我的数据库子集包含 8 个表 我需要创建复杂的查询来获取一些数据 我的内容提供程序可以很好地处理简单的查询 例如 我的表上有一个 PersonPersonModel jav
  • 检查 JavaScript 中的全局属性/函数是否已被覆盖

    JavaScript 可以轻松覆盖全局对象的属性和函数 我想找到一种方法来检查全局属性的原始版本是否已被替换 考虑有人将其放入 HTML 中 如果 myscript js 在某处调用encodeURIComponent 函数 它现在的行为将
  • 将 XX:XX AM/PM 转换为 24 小时制

    我搜索过谷歌 但找不到如何获取字符串 xx xx 上午 下午 例如下午 3 30 并将其更改为现在的 24 小时 例如 前一个时间是 15 30 我研究过简单地使用 if then 语句来操作字符串 但它看起来非常乏味 有什么简单的方法可以
  • 覆盖 Spring 表单错误消息

    在 Spring 中如何覆盖默认表单错误消息 我正在使用一个Validator和一个属性文件来添加我自己的错误消息 但是 例如 如何覆盖因转换 编码错误而打印的消息 它们似乎是自动生成的 我认为对用户没有帮助 Failed to conve
  • 如何优化查找相关性的极其缓慢的 MySQL 查询

    我有一个非常慢 通常接近 60 秒 的 MySQL 查询 它试图找到用户对一项民意调查的投票方式与他们对所有先前民意调查的投票方式之间的相关性 基本上 我们收集在给定民意调查中投票给某一特定选项的每个人的用户 ID 然后 我们查看该小组如何
  • 打开 dired 并选择与前一个缓冲区关联的文件?

    假设我正在编辑blah txt使用 Emacs 我决定打开dired以重命名文件 https stackoverflow com questions 384284 can i rename an open file in emacs 384
  • 如何使用 RxJS 对数据变化做出“反应”?

    RxJS 初学者 我在使用 RxJS 保存和跟踪数据更改时遇到问题 假设我在小视图 小部件中构建我的应用程序 每个视图 小部件都有自己的状态 并且应该对数据更改执行操作 我怎么做 更具体的例子 假设我有一个名为Widget and Widg
  • Autofac 和 Quartz.Net 集成

    有没有人有整合经验autofac and 石英网 如果是这样 最好在哪里控制生命周期管理 IJobFactory IJob 的执行中还是通过事件侦听器 现在 我正在使用自定义 autofacIJobFactory来创建IJob实例 但我没有
  • 在新门户中为辅助角色配置远程桌面

    我在新的 Windows Azure 门户中配置远程桌面连接时遇到问题 创建了一个新的工人角色 配置了远程桌面连接的过期时间 导出并上传生成的证书 发布了工作者角色 在新的 Windows Azure 门户 manage windowsaz
  • ASP.NET C# - 在服务器上保存文件流

    我有初学者的问题 如何将文件流保存到服务器上的文件 我懂了 var source Request QueryString src WebClient webclient new WebClient using Stream stream w
  • 即使使用 where 子句,“SELECT COUNT(*)”也很慢

    我试图弄清楚如何优化 MySQL 中非常慢的查询 我没有设计这个 SELECT COUNT FROM change event me WHERE change event id gt 1212281603783391 COUNT 32240
  • 如何通过蓝牙麦克风录制音频

    我正在尝试通过蓝牙耳机麦克风录制音频 但我只能听到音频 但无法通过蓝牙麦克风录制音频 而是可以从移动麦克风录制语音 我正在使用下面的代码 IntentFilter newintent new IntentFilter newintent a