Android:通过Sco蓝牙耳机播放声音

在过去的几天里,我一直试图从我的Android手机上播放我的sco蓝牙耳机上的任何声音。 我这个项目的最终目标是最终制作一个车库门开启器,但首先我需要能够通过耳机播放声音。

这是我正在使用的当前代码的基础:

==Manifest==  ==Code== audioManager = (AudioManager) getSystemService(AUDIO_SERVICE); audioManager.setMode(AudioManager.MODE_IN_CALL); audioManager.startBluetoothSco(); audioManager.setBluetoothScoOn(true); short[] soundData = new short [8000*20]; for (int iii = 0; iii < 20*8000; iii++) { soundData[iii] = 32767; iii++; soundData[iii] = -32768; } audioTrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, 8000, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, soundData.length * Short.SIZE, AudioTrack.MODE_STATIC); audioTrack.write(soundData, 0, soundData.length); audioTrack.play(); 

在我运行之前,我将蓝牙耳机与手机配对并连接。 我通过调用我的语音邮件validation了它的工作原理。 然而,当我运行我的代码时,任何地方都没有声音。

以下是不同代码行的效果:

当我刚刚运行我的应用时:

  audioManager.setMode(AudioManager.MODE_IN_CALL); 

无论我做什么,这条线都会让我的所有声音停止工作,因此它通常会被注释掉。

  audioManager.startBluetoothSco(); audioManager.setBluetoothScoOn(true); 

这两条线让声音停止从前置扬声器中出来,让我的耳机发出咔嗒声,嘶嘶声就像是打开了,但是没有输出。

 AudioManager.STREAM_VOICE_CALL 

这是我调用AudioTrack构造函数的一部分,但它有很大的不同。 由于此设置为STREAM_VOICE_CALL,声音从前置扬声器发出,如果我将其设置为STREAM_MUSIC,则声音会从后置扬声器发出。

当我在通话期间打开我的应用时:

  audioManager.setMode(AudioManager.MODE_IN_CALL); 

在通话期间,此行无效,因为已设置MODE_IN_CALL。 但不同的是,我的声音与电话混合在一​​起,而通常它根本不播放。

  audioManager.startBluetoothSco(); audioManager.setBluetoothScoOn(true); 

它们的对应部分可以控制音频的来源。 如果我把它关掉,我的声音和电话都来自前置扬声器,打开后,电话就会来自我的耳机而且我的声音丢失了。

至于为什么我的代码不起作用,老实说我不知道​​。 我相信我已经完成了使用startBluetoothSco()的清单。

 Even if a SCO connection is established, the following restrictions apply on audio output streams so that they can be routed to SCO headset: - the stream type must be STREAM_VOICE_CALL - the format must be mono - the sampling must be 16kHz or 8kHz 

那么,有没有人知道我做错了什么? 曾经有一段时间我设法让我的声音通过耳机播放,但当我忘记停止()我的AudioTrack这只是一个短音,所以我不得不认为这是一个小故障。

我在这个页面上找到了解决方案。 你必须调用audioManager.setMode(AudioManager.MODE_IN_CALL); 只有在连接套接字后,即您收到了AudioManager.SCO_AUDIO_STATE_CONNECTED 。 我可以在运行Android 2.2.2的Spica上听到TTS。

编辑:这是我的(旧)实现:

 public class BluetoothNotificationReceiver extends BroadcastReceiver { /** * */ public BluetoothNotificationReceiver(Handler h) { super(); bnrHandler = h; } /* (non-Javadoc) * @see android.content.BroadcastReceiver#onReceive(android.content.Context, android.content.Intent) */ @Override public void onReceive(Context arg0, Intent arg1) { String action = arg1.getAction(); if (action.equalsIgnoreCase(AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED)) { int l_state = arg1.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, -1); Log.d("bnr", "Audio SCO: " + AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED); switch(l_state) { case AudioManager.SCO_AUDIO_STATE_CONNECTED: { Log.i("bnr", "SCO_AUDIO_STATE_CONNECTED"); } break; case AudioManager.SCO_AUDIO_STATE_DISCONNECTED: { Log.e("bnr", "SCO_AUDIO_STATE_DISCONNECTED"); } break; default: Log.e("bnr", "unknown state received:"+l_state); } } else Log.e("bnr", "onReceive:action="+action); } } 

我不知道它是否仍在使用新的API。

尝试将audiomanager设置为AudioManager.MODE_NORMAL。 这对我有用。

我实际上设法解决了这个问题。 问题是我在耳机上播放的音调太高了。 我通过简单地加倍创建音频文件的代码来修复它,使其变为HIGH HIGH LOW LOW而不是HIGH LOW HIGH LOW。

添加到清单: