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();
}
});
}
});
我按照 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();
}
});
}
});