You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android语音通话时保持音乐正常播放可行吗?Unity Vivox技术问询

问题解答

这是Android的预期行为吗?

是的。Android的MODE_IN_COMMUNICATION是专为语音通话场景设计的音频模式,系统会自动执行以下优化逻辑,导致你遇到的现象:

  • 优先将音频路由到通话设备(听筒/扬声器)
  • 自动压低媒体音频流(游戏音乐、3D音效均属于此类)的音量,确保语音通话的清晰度
  • 限制部分音频特效(如3D音效的空间特性),以优化语音传输质量

如何避免语音通话影响音乐播放?

以下是几种可落地的解决方案,按实现复杂度排序:

方案1:调整Vivox的音频模式(优先尝试)

部分Vivox版本允许开发者修改Android平台的音频模式。你可以尝试将默认的MODE_IN_COMMUNICATION改为MODE_NORMAL,该模式不会触发系统的通话音量压低逻辑。
在Unity中可通过Vivox的API配置:

// 示例代码(需匹配Vivox实际API)
var audioSession = VivoxService.Instance.AudioSession;
audioSession.SetAudioMode(AndroidAudioMode.Normal);

⚠️ 注意:修改模式可能降低语音通话的回声消除效果,需测试验证语音质量。

方案2:手动强制恢复媒体音量

既然系统会自动压低媒体音量,你可以在语音会话启动/结束时,手动控制游戏音乐、音效的音量:

private float _originalMusicVol;
private float _originalSfxVol;

// 语音会话启动时调用
public void OnVoiceSessionStart()
{
    // 保存原音量
    _originalMusicVol = MusicAudioSource.volume;
    _originalSfxVol = SfxAudioSource.volume;
    
    // 强制设置为正常音量
    MusicAudioSource.volume = 1f;
    SfxAudioSource.volume = 1f;

    // 可选:通过Android原生API调整系统媒体音量
    #if UNITY_ANDROID && !UNITY_EDITOR
    var audioManager = new AndroidJavaClass("android.app.Activity")
        .Call<AndroidJavaObject>("getSystemService", "audio");
    int maxVol = audioManager.Call<int>("getStreamMaxVolume", 3); // 3对应STREAM_MUSIC
    audioManager.Call("setStreamVolume", 3, maxVol, 0);
    #endif
}

// 语音会话结束时调用
public void OnVoiceSessionEnd()
{
    // 恢复原音量
    MusicAudioSource.volume = _originalMusicVol;
    SfxAudioSource.volume = _originalSfxVol;
}

方案3:利用Android音频焦点机制(进阶)

通过请求媒体音频焦点,让系统允许媒体音频与语音通话共存,避免被压低。需要编写简单的Android插件:

Android插件代码(Java)

package com.yourgame.audio;

import android.content.Context;
import android.media.AudioManager;

public class AudioFocusHandler {
    private AudioManager _audioManager;
    private AudioManager.OnAudioFocusChangeListener _focusListener;

    public AudioFocusHandler(Context ctx) {
        _audioManager = (AudioManager) ctx.getSystemService(Context.AUDIO_SERVICE);
        _focusListener = focusChange -> {
            // 可根据焦点变化调整逻辑,比如语音结束后恢复系统默认音量
        };
    }

    public void requestMediaFocus() {
        int result = _audioManager.requestAudioFocus(
            _focusListener,
            AudioManager.STREAM_MUSIC,
            AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK
        );
        if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
            // 焦点获取成功,强制拉满媒体音量
            int maxVol = _audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
            _audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, maxVol, 0);
        }
    }

    public void releaseMediaFocus() {
        _audioManager.abandonAudioFocus(_focusListener);
    }
}

Unity侧调用代码

#if UNITY_ANDROID && !UNITY_EDITOR
private AndroidJavaObject _audioFocusHandler;

void Start()
{
    var unityActivity = new AndroidJavaClass("com.unity3d.player.UnityPlayer")
        .GetStatic<AndroidJavaObject>("currentActivity");
    _audioFocusHandler = new AndroidJavaObject("com.yourgame.audio.AudioFocusHandler", unityActivity);
}

public void OnVoiceSessionStart()
{
    _audioFocusHandler.Call("requestMediaFocus");
}

public void OnVoiceSessionEnd()
{
    _audioFocusHandler.Call("releaseMediaFocus");
}
#endif

方案4:分离音频流(需Vivox支持)

如果Vivox允许指定音频流,可将语音通话分配到STREAM_VOICE_CALL,游戏音频保留在STREAM_MUSIC,这样系统会分别控制两类音量,不会互相压制。具体需查看Vivox官方文档是否有相关配置项。

内容的提问来源于stack exchange,提问作者Mingheng Wang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 04:15:41