0

我正在开发一个 Voip 应用程序,我有一个极端情况,我想同时播放两个原始文件。

当我的应用程序有来电时,我正在创建一个新的 Mediaplayer 并播放自定义铃声。当我收到一个传入的 GSM 呼叫后不久,我会创建一个新的媒体播放器并播放敲门声,以向用户反馈还有一个 GSM 呼叫传入。同时我希望自定义铃声继续播放。

private fun setAudioAttributesForFile(audioUsage: Int): AudioAttributes {
    return AudioAttributes.Builder()
            .setUsage(audioUsage)
            .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
            .build()
}

private fun startRingtone(fileToPlay: Int): MediaPlayer {
    return MediaPlayer().apply {
        reset()
        if (fileToPlay == R.raw.ring {
            setAudioAttributes(setAudioAttributesForFile(AudioAttributes.USAGE_NOTIFICATION_RINGTONE))
        } else {
            setAudioAttributes(setAudioAttributesForFile(AudioAttributes.USAGE_MEDIA))
        }
        isLooping = true
        Main.get().resources.openRawResourceFd(fileToPlay).use {
            setDataSource(
                    it.fileDescriptor,
                    it.startOffset,
                    it.length
            )
        }
        setOnPreparedListener { start() }
        prepareAsync()
    }
}

我在这段代码中遇到的问题是,一旦敲门声正在播放,系统就会将铃声静音,并且一旦敲门声停止,铃声就会继续。

我也尝试过:

  1. 仅使用 AudioAttributes.USAGE_NOTIFICATION_RINGTONE. 一旦敲门声开始播放,两个媒体播放器都会静音。

  2. 如果我离开setAudioAttributes()电话并将这四行替换为

if (fileToPlay == R.raw.ring) {
    setAudioAttributesForFile(AudioAttributes.USAGE_NOTIFICATION_RINGTONE)
} else {
    setAudioAttributesForFile(AudioAttributes.USAGE_MEDIA)
}

然后我可以同时播放这两个文件。那么问题是铃声文件没有显示为铃声,而是仅显示为媒体文件。因此,当我增加和减少铃声的音量时,标志不会显示它是铃声。

有没有办法将一种声音作为铃声播放,而另一种声音作为正常的媒体声音播放?

提前致谢。任何帮助表示赞赏。

4

1 回答 1

0

如果您想同时播放两种声音,请使用声音池。

于 2019-05-27T14:57:51.987 回答