首页 > 解决方案 > 媒体播放器不会停止

问题描述

虽然不是 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()
    }


}

标签: androidkotlinandroid-mediaplayer

解决方案


您正在实例化完全不同的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()
                }
            }
        })
    }
}

推荐阅读