android - 媒体播放器不会停止
问题描述
虽然不是 100% 我有媒体播放器在播放,但现在它不会停止。我收到以下错误
E/ExtMediaPlayer-JNI: QCMediaPlayer 无法定位.... E/MediaPlayer-JNI: JNIMediaPlayerFactory: bIsQCMediaPlayerPresent 0 E/ExtMediaPlayer-JNI: QCMediaPlayer 无法定位.... E/MediaPlayer-JNI: JNIMediaPlayerFactory: bIsQCMediaPlayerPresent 0 E/MediaPlayer:在状态 1 中停止调用,mPlayer(0x0) 错误 (-38, 0) W/MediaPlayer:mediaplayer 因未处理的事件而消失
package com.radiomedia.drn1
import android.media.AudioManager
import android.media.MediaPlayer
import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity(){
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
playButton.setOnClickListener(object: View.OnClickListener {
override fun onClick(v: View?) {
if(playButton.text.toString()=="Pause") {
media().play()
}
else{
media().stop()
}
}
})
}
}
class media(){
val mp = MediaPlayer()
fun play(){
val url = "http://stream.radiomedia.com.au:8003/stream" // your URL here
mp.setAudioStreamType(AudioManager.STREAM_MUSIC)
mp.setDataSource(url)
mp.prepare() // might take long! (for buffering, etc)
mp.start()
}
fun stop(){
mp.stop()
mp.release()
}
}
解决方案
您正在实例化完全不同的MediaPlayer
. 通过调用media()
,您将创建media
该类的一个新实例,然后创建一个新实例MediaPlayer
作为其属性mp
。但是由于这个media
实例不是 的属性MainActivity
,所以当点击监听器返回时它会超出范围。
然后底层媒体播放器被释放,这解释了您看到的错误。但即使没有该错误,调用 stop 也不会产生任何影响,因为您不是在正在运行的 MediaPlayer 上调用它,而是在一个全新的 MediaPlayer 上调用它。
要实现您想要的,您需要在 中添加一个属性MainActivity
,例如:
class MainActivity : AppCompatActivity(){
private lateinit var mMedia: media
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mMedia = media()
playButton.setOnClickListener(object: View.OnClickListener {
override fun onClick(v: View?) {
if(playButton.text.toString()=="Pause") {
// Go back to start to replay
mMedia.seekTo(0)
mMedia.start()
}
else{
// Stopping prevents MediaPlayer to be played again. Use pause() instead
mMedia.pause()
}
}
})
}
}
推荐阅读
- python - Python 请求,为每个请求绑定到不同的源 ip,但未按预期工作
- reactjs - 拖放时ReactJs Dropzone不起作用
- java - 在 Java 上,使用反射,如何判断字段的值是在声明中设置还是在构造函数主体中设置
- python - 更改 scipy.stats.probplot 中样本子集的样式
- python-3.x - 从另一个 DataFrame 为每列创建唯一值的数据框
- reporting-services - SSRS - 根据where子句在表达式中显示字段?
- excel - 过滤后的 Hlookup vba
- javascript - 无法删除传单地图中的折线
- java - Spring @Transactional 和长期运行的业务逻辑
- python-3.x - flask db migrate 抛出“AttributeError:无法设置属性”