【发布时间】:2012-09-23 01:36:36
【问题描述】:
我正在编写一个小应用程序以从 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): 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): at android.os.HandlerThread.run(HandlerThread.java:60)
感谢任何帮助!
【问题讨论】:
-
在您的
onClick(...)方法中,您所做的只是...intent.putExtra("action", "play");您实际上并没有将Uri指向音乐源。这意味着Uri uri = intent.getData();将永远是null,因此NPE。 -
我可以发誓我已经将这些数据添加到我的意图中......我知道它在某个时候就在那里。在我的许多尝试之一中,我一定是出于某种原因删除了它。谢谢!我不觉得自己很愚蠢吗...
标签: android