我正在编写一个小应用程序,用于从网址下载歌曲,然后在使用媒体播放器的服务中播放。我得到了我需要工作的一切。但是,当我开始播放歌曲时,停止和暂停按钮不起作用,如果我再次播放,则开始播放该歌曲的第二个副本。我很确定我知道出了什么问题,我只是不知道如何解决它。
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)
任何帮助都表示赞赏!
答案 0 :(得分:0)
虽然Squonk的建议在创建播放器时帮助删除了初始NPE,但我仍然遇到了同样的问题。它将mp视为局部变量,因此更改并未持续存在。我通过将public static
修饰符添加到我的变量声明mp来解决这个问题。现在所有出现的mp都是同一个变量,并且更改仍然存在!