【发布时间】: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.SE 问题:"Is it possible to direct all audio output, including music output, to a Bluetooth headset?" 我尝试了几个不同的应用程序。最后,“单声道蓝牙路由器”是唯一对我有用的。