android - 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 模拟器)
可能是什么原因造成的,可以解决吗?
解决方案
推荐阅读
- c# - 删除 .Net 程序集的强名称,例如:-“microsoft.wtt.log.dll”
- angular - 为什么这个 RXJS 订阅即使有错误也会执行 `subscribe` 块?
- hive - Hive 错误无法实例化 org.apache.hadoop.hive.ql.metadata.sessionhivemetastoreclient
- python - 是否可以仅用眼睛识别人脸?
- css - 如何根据 Vuetify 中的屏幕大小更改对齐方式?
- python - 模拟 psycopg2 连接以测试是否插入了数据
- sql - PLSQL Oracle 11g 版本中每行的分隔逗号值
- testing - 软件架构 - 初学者的问题
- sql-server - 非聚集索引 - 包括 2 列始终为空 - 改进搜索?
- python - 用另一列的元素填充一列的 NA