通过两个MediaPlayers同时播放两个原始文件时出现问题

时间:2019-05-27 14:54:27

标签: android kotlin android-mediaplayer ringtone

我正在开发一个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。敲门声开始播放后,两个mediaPlayers都将静音。

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

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

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

有没有一种方法可以将一种声音作为铃声播放,另一种声音可以作为普通媒体声音播放?

先谢谢了。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

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