在过去的几天里,我一直试图在我的android手机上播放sco蓝牙耳机的任何声音。这个项目的最终目标是最终制造一个车库开门器,但首先我需要能够通过耳机播放声音。Android:通过Sco蓝牙耳机播放声音
这里是我使用的当前代码的基础:
==Manifest==
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
==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();
我跑在此之前,我配对我的蓝牙耳机到我的手机,并将它连接。我通过拨打我的语音邮件来验证它的工作原理。但是,当我运行我的代码时,没有任何声音来自任何地方。
这里有不同的代码行的作用:
当我刚刚运行我的应用程序:
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.MODE_NORMAL这个代码? – RedBullet