android WebView 通过听筒或蓝牙播放音频

Posted

技术标签:

【中文标题】android WebView 通过听筒或蓝牙播放音频【英文标题】:android WebView play audio through earpiece or Bluetooth 【发布时间】:2021-11-18 23:39:58 【问题描述】:

我正在使用 peer.js 和 WebView 开发语音通话应用程序。我的意图是通过听筒或蓝牙耳机(如果已连接)播放远程流。并且还应该有一个切换到扬声器的选项。我尝试了以下代码,但音频仍然来自扬声器。

   private fun setupAudio() 
        val am = getSystemService(AUDIO_SERVICE) as AudioManager
        am.mode = AudioManager.MODE_IN_CALL
        am.isSpeakerphoneOn = false
    

有没有更好的方法来做到这一点?或者我可以更改 WebView 的 AudiostreamType(就像在 MediaPlayer 中一样)?

【问题讨论】:

【参考方案1】:

确保在清单权限中添加<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

如果这不能解决问题,请尝试

Class audioSystemClass = Class.forName("android.media.AudioSystem");
Method setForceUse = audioSystemClass.getMethod("setForceUse", int.class, int.class);
// First 1 == FOR_MEDIA, second 1 == FORCE_SPEAKER. To go back to the default
// behavior, use FORCE_NONE (0).
setForceUse.invoke(null, 1, 1);

【讨论】:

我有这个权限。 试试这个Class audioSystemClass = Class.forName("android.media.AudioSystem"); Method setForceUse = audioSystemClass.getMethod("setForceUse", int.class, int.class); // First 1 == FOR_MEDIA, second 1 == FORCE_SPEAKER. To go back to the default // behavior, use FORCE_NONE (0). setForceUse.invoke(null, 1, 1); 收到此警告:不支持通过反射访问内部 API,并且可能不适用于所有设备或将来 它不工作 收到错误E/AudioSystem-JNI: Command failed for android_media_AudioSystem_setForceUse: -1【参考方案2】:

我搞定了,诀窍是在收到流后调用am.isSpeakerphoneOn = false

【讨论】:

以上是关于android WebView 通过听筒或蓝牙播放音频的主要内容,如果未能解决你的问题,请参考以下文章

android webRTC语音通话

如何仅使用 mediaplayer android 通过耳机播放音频

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

如何通过内置听筒扬声器播放音频

Android 音频开始缓慢通过蓝牙 sco 开始播放

如何在 iOS 中找到蓝牙音频设备