从扬声器 android 播放声音

Posted

技术标签:

【中文标题】从扬声器 android 播放声音【英文标题】:Play sound from speaker android 【发布时间】:2014-03-11 20:36:34 【问题描述】:

我用这段代码试试:

AudioManager audioManager = (AudioManager)getApplication().getSystemService(Context.AUDIO_SERVICE); 
        audioManager.setMode(AudioManager.MODE_IN_CALL);
        audioManager.setSpeakerphoneOn(true);

然后:

Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), Uri.parse("url.mp3"));
                        r.play();

但我的应用无法重现任何声音。

我该如何解决我的问题?

【问题讨论】:

您确定您的 URI 已正确解析?根据developer.android.com/reference/android/net/Uri.html 的说法,这个类并没有做太多检查,并且很乐意将垃圾扔回给它的用户。我对“url.mp3”字符串很怀疑,这个文件存放在哪里? 网址正确。我写“url.mp3”很简单。 【参考方案1】:

根据 OP,可以使用 MediaPlayer 找到最佳答案(此答案的 cmets 部分提供了示例链接)。

-- 以前的编辑--

尚未对此进行测试,如果有问题请见谅,但我认为通过设置铃声的默认值然后调用该默认值可能会更好。我还没有机会测试代码,但它应该看起来像......

要将音频路由到您的听筒:

private AudioManager audioManager;  
audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);  
audioManager.setMode(AudioManager.MODE_IN_CALL); 
audioManager.setSpeakerphoneOn(false);

然后查看 AudioTracks,这可能是您想要做的事情的方式,因为 Ringtone 具有基于 Android 原生处理的默认操作;应该是这样的

InputStream in =getResources().openRawResource("user_mp3");      
AudioTrack audio = new AudioTrack(AudioManager.STREAM_MUSIC, 11025, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, buffersize, AudioTrack.MODE_STREAM);

byte[] sound = null;
sound = new byte[in.available()]; 
sound =convertStreamToByteArray(in);
in.close();
audio.write(sound, 0, sound.length());
audio.play();

但请务必在完成后使用 AudioManager 将模式恢复正常。我认为这应该有效。还有已弃用的 AudioManager.ROUTE_EARPIECE 调用,您可能想检查一下它们是如何替换它的。

再次,没有时间测试这个,只是在运行中输入它。如果您发现错误,请告诉我。

我原来的“铃声”风格输出:

Uri soundPath = Uri.parse("uri_link_for_mp3");
RingtoneManager.setActualDefaultRingtoneUri(getApplicationContext(), 
        RingtoneManager.TYPE_RINGTONE, soundPath);

Uri ringtone = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), ringtone);
r.play();

必须快速打字,可能错过了一些东西,只是没有想到它。不过有一个很好的链接:Setting Ringtone in Android

【讨论】:

您的意思是您不想让扬声器播放它,或者它没有使用我的代码播放? 使用您的解决方案,声音可以正常播放,而不是通过通话期间使用的扬声器播放.. 哦,所以你想让它通过耳机而不是铃声扬声器播放? 我想模拟通话..我想重现声音,让它看起来像是来自通话.. 确保在 AudioManager 中将扬声器设置为 false(您不希望它通过扬声器)

以上是关于从扬声器 android 播放声音的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式从外部或内部扬声器播放声音

从 iOS 应用程序到蓝牙扬声器播放现场声音

iOS - 在录制视频时播放音频/声音

如何从一组双重创建声音并在扬声器上播放

同时播放两种声音,其中一种通过蓝牙发送 - iOS 和 Android

如何在通话期间以编程方式在 iPhone 的两个扬声器上播放声音