0

我正在编写一个小应用程序以从 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)

任何帮助都将不胜感激!

4

1 回答 1

0

虽然 Squonk 的建议确实有助于在创建播放器时删除初始 NPE,但我仍然遇到同样的问题。它将 mp 视为局部变量,因此更改不会持续存在。我通过将public static修饰符添加到我的 mp 变量声明中解决了这个问题。现在所有出现的 mp 都是同一个变量,并且变化持续存在!

于 2012-09-23T16:15:04.143 回答