首页 > 解决方案 > Android MediaPlayer:在 API 19 上出现错误 (1,-1004)?

问题描述

当我的活动开始时,我正在使用 MediaPlayer 从 url 播放音乐。它适用于 19 以上的 API,但不适用于 API 19(模拟器)。为什么会发生这种情况以及如何解决?

我在stackoverflow上搜索过这个问题,大多数答案都表明错误是由连接不良或无效状态引起的(在准备之前正在播放媒体),但我确实使用了该prepareAsync方法并在方法中启动了音频onPrepared。我也在其他设备和模拟器上做了测试(API 19 以上),没有出现错误。

这是我的代码。

private lateinit var mediaPlayer: MediaPlayer
private var isMediaPrepared: Boolean = false
private val backsoundUrl = "https://www.soundhelix.com/examples/mp3/SoundHelix-Song-8.mp3"

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_game)

    mediaPlayer = createPlayer()
    mediaPlayer.apply {
        try {
            setDataSource(backsoundUrl)
            isLooping = true
            setOnPreparedListener { mp ->
                isMediaPrepared = true
                mp.start()
            }
            prepareAsync()
        } catch (e: IllegalStateException) {
            e.printStackTrace()
        } catch (e: IllegalArgumentException){
            e.printStackTrace()
        } catch (e: IOException) {
            e.printStackTrace()
        }
    }
}

private fun createPlayer(): MediaPlayer {
    return MediaPlayer().apply {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            setAudioAttributes(
                AudioAttributes.Builder()
                    .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                    .setUsage(AudioAttributes.USAGE_MEDIA)
                    .build()
            )
        } else {
            setAudioStreamType(AudioManager.STREAM_MUSIC)
        }
    }
}

override fun onStop() {
    super.onStop()
    if (mediaPlayer.isPlaying) {
        mediaPlayer.pause()
    }
}

override fun onDestroy() {
    if (mediaPlayer.isPlaying) {
        mediaPlayer.stop()
    }
    mediaPlayer.reset()
    mediaPlayer.release()
    super.onDestroy()
}

编辑: 这是我的 logcat

01-20 10:15:52.248 5171-5171/com.example.guessthesound E/MediaPlayer: Should have subtitle controller already set
01-20 10:15:52.518 5171-5183/com.example.guessthesound E/MediaPlayer: error (1, -1004)
01-20 10:15:52.518 5171-5171/com.example.guessthesound E/MediaPlayer: Error (1,-1004)

编辑2:

此代码曾经在模拟器 API 21 上工作,但现在它无法播放音频并且 logcat 只显示错误E/MediaPlayer: Should have subtitle controller already set。我阅读了https://stackoverflow.com/a/20149754/11986468和其他类似问题,大多数答案建议忽略它。我不知道它是否因为这个错误而无法播放音频,但没有其他错误。找到这个后,我尝试在具有 API 21 的设备上进行测试,它运行良好,那么模拟器可能有问题吗?API 19 上的错误是否可能是因为我使用的是模拟器?(我正在使用 Android Studio 模拟器)

可能是什么原因造成的,可以解决吗?

标签: androidandroid-mediaplayer

解决方案


推荐阅读