android 媒体播放器:在状态0中调用start,mPlayer(0x0)

iklwldmw  于 2022-12-21  发布在  Android
关注(0)|答案(1)|浏览(299)

我正在开发一个简单的音乐播放器,但是有时会出现错误(只有一行错误):
错误:在状态0下调用start,mPlayer(0x0)
我有一个MusicService来操作一些关于音乐的东西。它的一部分:

@Override
public void onCreate() {
    super.onCreate();
    mediaPlayer = new MediaPlayer();
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    mediaPlayer.setOnBufferingUpdateListener(this);
    mediaPlayer.setOnPreparedListener(this);
    mediaPlayer.setOnCompletionListener(this);
}
...

public void play(String url) {
    try {
        mediaPlayer.reset();
        mediaPlayer.setDataSource(url);
        mediaPlayer.prepareAsync();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
...

@Override
public void onPrepared(MediaPlayer mp) {
    mp.start();
    addTimer();
    status = MUSIC_STATUS_PLAYING;
}

打开Activity,绑定MusicService,执行play()时,有时会出现错误。
你知道吗?

y1aodyip

y1aodyip1#

我在Kotlin遇到了同样的问题,我能够解决它。
在我的例子中,我添加了MediaPlayer.create()在一个布尔语句中,所以让我们假设在片段1中我使用了一个名为“globalAudio”的布尔值,我从“MyModel”类全局设置了这个布尔值为真,因此它将正常执行MediaPlayer.create,因为它在条件体之外为真。但是,如果我移动到片段2并将布尔值“globalAudio”设置为假,当我返回片段1时,Logcat将向我抛出错误“在状态64中调用暂停,mPlayer(0xca 47 c 070)”和“错误(-38,0)",因为我试图在没有设置Media.create()的情况下启动音频。
我在下面附上了问题和解决方案,以便您更容易理解
问题

if (MyModel.StaticData.globalAudio) { // A
    homeAudio = MediaPlayer.create(requireActivity(), R.raw.background1)
    homeAudio.setVolume(MyModel.StaticData.backgroundVolume, MyModel.StaticData.backgroundVolume)         
}
if (homeAudio.isPlaying) { // B
    homeAudio.pause() // pause
    homeAudio.seekTo(0) // set start from 00:00
}

if (!homeAudio.isPlaying) { // C
    homeAudio.start() // throws error if A is not executed
}

解决方案

//A
homeAudio = MediaPlayer.create(requireActivity(), R.raw.background1)
homeAudio.setVolume(MyModel.StaticData.backgroundVolume, MyModel.StaticData.backgroundVolume)

if (homeAudio.isPlaying) { // B
    homeAudio.pause() // pause
    homeAudio.seekTo(0) // set start from 00:00
}

if (!homeAudio.isPlaying) { // C
    homeAudio.start() // won't throw error because A is always executed
}

在这里,我为您提供了一个Kotlin代码,它可以自动转换为Java在Android Studio:

var myAudio = MediaPlayer.create(requireActivity(), R.raw.[yourAudio])
myAudio.setVolume([leftChannelInFLoat], [rightChannelInFLoat])

if (myAudio.isPlaying) {
    myAudio.pause()
    myAudio.seekTo(0)
}

if (!hmyAudio.isPlaying) {
    myAudio.start()
}

相关问题