MediaPlayer.create() returns 空

MediaPlayer.create() returns NULL

我按照 YouTube 教程学习了如何创建 android mp3 播放器应用程序。该应用程序有多个按钮,一个用于上一首歌曲,一个用于 Pause/Play,一个用于下一首歌曲。 Play/Pause 个按钮,只暂停我的 MediaPlayer,无论我点击它们多少次,它们都能正常工作。

另一方面,Next/Previous 按钮导致我的代码抛出 NullPointerException。我发现这是因为 MediaPlayer.create(Context, Uri) 函数有时 returns 为空。在我的应用程序上,功能大约失败。每十次按下 Next 按钮,或每第十次创建 MediaPlayer。

有办法解决这个问题吗?我尝试自己修改应用程序,但没有用。我尝试在 continue while 循环中循环变量 myMysicPlayer,直到它得到 while != null

while(myMusicPlayer != null){
 Uri u = new Uri(...);
 myMediaPlayer = MediaPlayer.create(getAppContext(), u);
}

我尝试使用等待 myMusicPlayer 准备好停止的侦听器,但它只是取消引用 null,显然失败了。

btnNext.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
myMediaPlayer.stop();
myMediaPlayer.reset();
myMediaPlayer.release();
position = (position + 1) % mySongs.size();
Uri u = Uri.parse(mySongs.get(position).toString());                    
songLabelName.setText(mySongs.get(position).toString());    
myMediaPlayer = MediaPlayer.create(getApplicationContext(), u);
myMediaPlayer.start();    
}
});

错误信息:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.aizenangel.myapplication, PID: 20169
    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.media.MediaPlayer.start()' on a null object reference            at com.aizenangel.myapplication.SongPlayer.onClick(SongPlayer.java:168)
    at android.view.View.performClick(View.java:6291)
    at android.view.View$PerformClick.run(View.java:24931)
    at android.os.Handler.handleCallback(Handler.java:808)
    at android.os.Handler.dispatchMessage(Handler.java:101)
    at android.os.Looper.loop(Looper.java:166)
    at android.app.ActivityThread.main(ActivityThread.java:7523)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)
    I/Process: Sending signal. PID: 20169 SIG: 9

我的错误是:
1) 我使用 myMediaPlayer.release() 方法,释放所有资源 与 MediaPlayer 对象关联
2)而不是使用相同的 MediaPlayer 对象,我总是用 myMediaPlayer = MediaPlayer.create(Context, Uri),MediaPlayer.create(Context, Uri) returns 失败时为 null,这会导致 NullPointerException

解决方法很简单。我删除了 myMediaPlayer.release() 行,而不是创建新对象,而是修改了我在开始时获得其引用的对象。

btnNext.setOnClickListener(new View.OnClickListener() {
  public void onClick(View view) {
   myMediaPlayer.stop();
   myMediaPlayer.reset();
   position = (position+1)%mySongs.size();
   Uri u = Uri.parse((mySongs.get(position)).toString());
   songLabelName.setText(mySongs.get(position).toString());
   try {
    myMediaPlayer.setDataSource(getApplicationContext(),u);
    myMediaPlayer.prepare();
   }catch (IOException e) {
    e.printStackTrace();
   }
   myMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mediaPlayer) {
     myMediaPlayer.start();
    }
   });
  }
});