想知道关闭应用程序后如何播放下一首歌曲,就像播放整个CD或播放列表一样……
发布于 2011-07-13 01:22:35
媒体播放器仅播放一首音轨。媒体播放器所做的就是收听onCompletion事件并播放下一首曲目。
MediaPlayer绑定到流程,而不是活动,所以只要流程运行,它就会一直播放。该活动可能会被暂停或销毁,但这不会影响MediaPlayer使用的内部线程。
我正在构建一个音频播放器来学习安卓,你可以看到播放音频文件的here服务
编辑
关于第一个评论:服务继续在后台运行,并在您“退出”应用程序后继续运行,因为服务和活动的生命周期是不同的。
为了播放下一首曲目,该服务在MediaPlayer上注册一个回调,以便在音频流完成时通知该服务。当音频播放完成时,该服务通过调用MediaPlayer.release()来清理MediaPlayer使用的资源,然后使用要播放的下一个音轨创建一个新的媒体播放器,并注册它自己以便在该音轨结束时再次收到通知,ad infinitum :)。
MediaPlayer类不理解播放列表,因此该服务负责在前一首曲目结束后播放曲目。
在我创建的AudioPlayer服务中,activity对AudioPlayer中的曲目进行排队,AudioPlayer负责按顺序播放曲目。
我希望这是清楚的,如果你有时间,请检查我上面放的AudioPlayer服务的代码。它不是纯粹的美,但它有它的作用。
发布于 2011-07-13 01:34:14
您可以创建一个服务,以便在应用程序退出或暂停后继续播放MediaPlayer。要让MediaPlayer播放连续的曲目,您可以注册一个onCompletionListener,它将决定接下来要播放的曲目。下面是一个执行此操作的简单示例服务:
package edu.gvsu.cis.muzak;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.net.Uri;
import android.os.IBinder;
import android.util.Log;
public class MuzakService extends Service {
private static final String DEBUG_TAG = "MuzakService";
private MediaPlayer mp;
private String[] tracks = {
"http://freedownloads.last.fm/download/288181172/Nocturne.mp3",
"http://freedownloads.last.fm/download/367924875/Behemoths%2BSternentanz.mp3",
"http://freedownloads.last.fm/download/185193341/Snowflake%2BImpromptu.mp3",
"http://freedownloads.last.fm/download/305596593/Prel%25C3%25BAdio.mp3",
"http://freedownloads.last.fm/download/142005075/Piano%2BSonata%2B22%2B-%2Bmovement%2B2%2B%2528Beethoven%2529.mp3",
"http://freedownloads.last.fm/download/106179902/Piano%2BSonata%2B%25231%2B-%2Bmovement%2B%25234%2B%2528Brahms%2529.mp3",
};
private int currentTrack = 0;
@Override
public void onCreate() {
super.onCreate();
Log.d(DEBUG_TAG, "In onCreate.");
try {
Uri file = Uri.parse(tracks[this.currentTrack]);
mp = new MediaPlayer();
mp.setDataSource(this, file);
mp.prepare();
mp.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
currentTrack = (currentTrack + 1) % tracks.length;
Uri nextTrack = Uri.parse(tracks[currentTrack]);
try {
mp.setDataSource(MuzakService.this,nextTrack);
mp.prepare();
mp.start();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
} catch (Exception e) {
Log.e(DEBUG_TAG, "Player failed", e);
}
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Log.d(DEBUG_TAG, "In onDestroy.");
if(mp != null) {
mp.stop();
}
}
@Override
public int onStartCommand(Intent intent,int flags, int startId) {
super.onStart(intent, startId);
Log.d(DEBUG_TAG, "In onStart.");
mp.start();
return Service.START_STICKY_COMPATIBILITY;
}
@Override
public IBinder onBind(Intent intent) {
Log.d(DEBUG_TAG, "In onBind with intent=" + intent.getAction());
return null;
}
}您可以在活动中启动此服务,如下所示:
Intent serv = new Intent(this,MuzakService.class);
startService(serv);然后像这样停下来:
Intent serv = new Intent(this,MuzakService.class);
stopService(serv);发布于 2012-06-25 21:44:58
请注意,服务也在前台运行。
请参考官方文档。它用一个示例代码进行了解释。在MediaPlayer中使用服务:http://developer.android.com/guide/topics/media/mediaplayer.html#mpandservices
作为前台服务运行
服务通常用于执行后台任务
但是考虑一下播放音乐的服务的情况。显然,这是一个用户主动意识到的服务,任何中断都会严重影响用户的体验。此外,这是一个用户可能希望在其执行期间与之交互的服务。在这种情况下,服务应该作为“前台服务”运行。前台服务在系统中具有更高的重要性-系统几乎不会终止该服务,因为它对用户来说是直接重要的。在前台运行时,服务还必须提供状态栏通知,以确保用户知道正在运行的服务,并允许他们打开可以与服务交互的活动。
要将服务转换为前台服务,必须为状态栏创建通知并从服务调用startForeground()
https://stackoverflow.com/questions/6668298
复制相似问题