哪里开始服务?

时间:2012-09-23 01:36:36

标签: android

我正在编写一个小应用程序,用于从网址下载歌曲,然后在使用媒体播放器的服务中播放。我得到了我需要工作的一切。但是,当我开始播放歌曲时,停止和暂停按钮不起作用,如果我再次播放,则开始播放该歌曲的第二个副本。我很确定我知道出了什么问题,我只是不知道如何解决它。

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

我已经使用Log调用来确定我崩溃的地方。使用我的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):at 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)

任何帮助都表示赞赏!

1 个答案:

答案 0 :(得分:0)

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