我正在编写一个小应用程序以从 url 下载歌曲,然后使用媒体播放器在服务中播放它。我已经拥有了我需要工作的一切。但是,当我开始播放歌曲时,停止和暂停按钮不起作用,如果我再次点击播放,则开始播放歌曲的第二份副本。我很确定我知道出了什么问题,我只是不知道如何解决它。
public class Player extends IntentService {
public Player() {
super("Player");
}
MediaPlayer mp;
@Override
protected void onHandleIntent(Intent intent) {
Bundle extras = intent.getExtras();
Uri uri = intent.getData();
mp = MediaPlayer.create(this, uri);
if(extras != null)
{
if(extras.getString("action").equals("play"))
{
mp.start();
}
else if(extras.getString("action").equals("pause"))
{
mp.pause();
}
else if(extras.getString("action").equals("stop"))
{
if (mp != null) {
mp.stop();
mp.release();
}
}
}
}
}
我的一个按钮的代码示例:
play.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
intent.putExtra("action", "play");
startService(intent);
}});
我相信每次我点击一个按钮并发送我的意图时,它都会创建我的媒体播放器的另一个实例,所以它不会暂停或播放,因为那个副本没有播放,而点击播放只会产生另一个副本。我试图设置它,以便我第一次并且只有第一次点击播放时创建播放器,但这没有奏效。我还尝试进行另一个操作,例如“创建”并在主要活动第一次下载文件时发送它,但这也不起作用。两者都导致它崩溃。也许我做错了;很抱歉,我没有这些代码副本或 LogCat。有人对我如何只创建一次播放器有任何建议吗?或者将文件的 uri 传递给 onCreate?
编辑:自从发布此消息后,我再次尝试更改播放按钮响应。就是现在:
protected void onHandleIntent(Intent intent) {
Bundle extras = intent.getExtras();
if(extras != null)
{
if(extras.getString("action").equals("play"))
{
if (mp != null) {
mp.start();
}
else {
Uri uri = intent.getData();
mp = MediaPlayer.create(this, uri);
mp.start();
}
}
我已经使用日志调用来确定我崩溃的地方。我的 LogCat 的 .create 调用失败了:
09-22 22:58:24.566:E/AndroidRuntime(1446):致命异常:IntentService[Player] 09-22 22:58:24.566:E/AndroidRuntime(1446):java.lang.NullPointerException 09-22 22:58 :24.566: E/AndroidRuntime(1446): 在 android.media.MediaPlayer.setDataSource(MediaPlayer.java:868) 09-22 22:58:24.566: E/AndroidRuntime(1446): 在 android.media.MediaPlayer.setDataSource( MediaPlayer.java:854) 09-22 22:58:24.566: E/AndroidRuntime(1446): 在 android.media.MediaPlayer.create(MediaPlayer.java:788) 09-22 22:58:24.566: E/AndroidRuntime( 1446): 在 android.media.MediaPlayer.create(MediaPlayer.java:769) 09-22 22:58:24.566: E/AndroidRuntime(1446): 在 com.example.mp3player.Player.onHandleIntent(Player.java:36 ) 09-22 22:58:24.566: E/AndroidRuntime(1446): 在 android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65) 09-22 22:58:24.566:E/AndroidRuntime(1446): 在 android.os.Handler.dispatchMessage(Handler.java:99) 09-22 22:58:24.566: E/AndroidRuntime(1446): 在 android.os.Looper.loop(Looper.java :137) 09-22 22:58:24.566: E/AndroidRuntime(1446): 在 android.os.HandlerThread.run(HandlerThread.java:60)
任何帮助都将不胜感激!