【问题标题】:Routing audio to Bluetooth Headset (non-A2DP) on Android在 Android 上将音频路由到蓝牙耳机(非 A2DP)
【发布时间】:2011-01-09 19:45:47
【问题描述】:

我有一个非 A2DP 单耳 BT 耳机 (Plantronics 510),并希望将它与我的 Android HTC Magic 一起使用来收听低质量的音频,例如播客/有声读物。

经过大量谷歌搜索,我发现只有电话音频可以路由到非 A2DP BT 耳机。 (我想知道您是否找到了将各种音频路由到非 A2DP BT 耳机的现成解决方案)

所以我想,我可以通过某种方式以编程方式将音频引导到携带电话音频的流中。这样我会欺骗手机将我的 mp3 音频传输到我的 BT 耳机。我写了以下简单的代码。

import android.content.*;
import android.app.Activity;
import android.os.Bundle;
import android.media.*;
import java.io.*;
import android.util.Log;

public class BTAudioActivity extends Activity
{
    private static final String TAG = "BTAudioActivity";

    private MediaPlayer mPlayer = null;
    private AudioManager amanager = null;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        amanager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
        amanager.setBluetoothScoOn(true);
        amanager.setMode(AudioManager.MODE_IN_CALL);

        mPlayer = new MediaPlayer();

        try {
            mPlayer.setDataSource(new FileInputStream(
                "/sdcard/sample.mp3").getFD());

            mPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);

            mPlayer.prepare();

            mPlayer.start();
        } catch(Exception e) {
            Log.e(TAG, e.toString());
        }
    }

    @Override
    public void onDestroy()
    {
        mPlayer.stop();
        amanager.setMode(AudioManager.MODE_NORMAL);
        amanager.setBluetoothScoOn(false);
        super.onDestroy();
    }
}

如您所见,我尝试了各种方法的组合,我认为这些方法会欺骗手机,使其相信我的音频是电话:

  • 使用 MediaPlayer 的 setAudioStreamType(STREAM_VOICE_CALL)
  • 使用 AudioManager 的 setBluetoothScoOn(true)
  • 使用 AudioManager 的 setMode(MODE_IN_CALL)

但以上都没有奏效。如果我在上面的代码中删除 AudioManager 调用,音频会从扬声器播放,如果我如上所示替换它们,那么音频将停止来自扬声器,但它不会来自 BT 耳机。所以这可能是部分成功。

我检查了 BT 耳机在通话时可以正常工作。

Android 不支持这一点一定是有原因的。但我不能放弃无法以编程方式重新路由音频的感觉。有什么想法吗?

附:以上代码需要以下权限

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>

【问题讨论】:

标签: android audio bluetooth


【解决方案1】:

这个帖子可能早就死了,但对于那些可能正在尝试同样事情的人来说,AudioManager 文档中的一些注释可能会很有用。看起来缺少的元素是 startBluetoothSco() 命令,但对该通道的使用有限制。来自 Android 开发网站here

public void startBluetoothSco () 自:API Level 8 启动蓝牙 SCO 音频连接。

需要权限: 修改_音频_设置。

此方法可用于 想要发送的应用程序和 接收到/来自蓝牙 SCO 的音频 手机不在时耳机 称呼。

作为SCO连接建立 可能需要几秒钟,应用程序 不应该依赖连接到 当方法返回时可用 而是注册接收 意图 ACTION_SCO_AUDIO_STATE_CHANGED 并等待状态 SCO_AUDIO_STATE_CONNECTED。

由于不能保证连接 成功,应用程序必须等待 这个意图有一个超时。

完成 SCO 连接后 或者如果建立超时, 应用程序必须调用 stopBluetoothSco() 清除 请求并关闭蓝牙 联系。

即使 SCO 连接是 成立,以下 限制适用于音频输出 流,以便它们可以被路由到 SCO耳机: - 流类型必须是 STREAM_VOICE_CALL - 格式必须是 单声道 - 采样必须为 16kHz 或 8kHz

以下限制适用于 输入流: - 格式必须是 单声道 - 采样必须是 8kHz

请注意,电话应用程序始终 优先使用 电话的 SCO 连接。如果这 方法在电话处于通话状态时被调用 调用它会被忽略。同样,如果 一个呼叫被接收或发送,而 应用程序正在使用 SCO 连接,连接将是 为申请而丢失,而不是 调用时自动返回 结束。

另见 stopBluetoothSco() ACTION_SCO_AUDIO_STATE_CHANGED

请注意,我没有对此进行测试,我只是传递我在研究类似项目时发现的线索。我认为 Jayesh 已经接近解决方案,而上述限制可能是导致它无法正常工作的原因。

【讨论】:

  • startBluetoothSco() 和
  • 我已经添加了这个 STREAM_VOICE_CALL,但是在一些三星设备(三星 S6)中它可以工作,而在其他设备上它不能工作。他们是否有任何其他模式可以从所有设备的蓝牙模式录制语音。我也尝试过 MODE_IN_COMMUNICATION 。
【解决方案2】:

开启:

 localAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
 localAudioManager.setMode(0);
 localAudioManager.setBluetoothScoOn(true);
 localAudioManager.startBluetoothSco();
 localAudioManager.setMode(AudioManager.MODE_IN_CALL);

要关闭:

 localAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
 localAudioManager.setBluetoothScoOn(false);
 localAudioManager.stopBluetoothSco();
 localAudioManager.setMode(AudioManager.MODE_NORMAL);

I took it from here

【讨论】:

    【解决方案3】:

    伟大的工作它对我来说很好,请在你的代码中进行一些修改,它会完美地工作,即

    mPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); 
    
    to 
    
    mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    

    【讨论】:

      【解决方案4】:

      应该为媒体播放器配置一个ALSA路由路径,以便它可以打开不同的音频路径,然后将您的音频路由到BT耳机。

      【讨论】:

        【解决方案5】:

        看不到明确接受的工作申请,因此提出了新的答案。此应用程序将音乐和音频路由到非 A2dp 耳机。尝试我的应用程序并在 github 中找到源代码以获取参考代码。 https://github.com/sauravpradhan/AnySound2BT

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-23
          • 1970-01-01
          • 2018-12-12
          • 1970-01-01
          • 1970-01-01
          • 2012-11-04
          • 2017-05-13
          • 1970-01-01
          相关资源
          最近更新 更多