安卓音乐播放器与服务

时间:2012-04-04 10:58:23

标签: android android-service android-notifications android-music-player

我正在寻找一个用于学习目的的Android音乐播放器的基本实现。我想要的只是一个带有服务和oncompletionlistener的音乐播放器,可以移动到下一个音轨和通知。但我还没有找到类似的东西。任何帮助将不胜感激。提前谢谢。

2 个答案:

答案 0 :(得分:1)

试试这段代码

VideoView videoView = (VideoView)findViewById(R.id.myvideoview);

             videoView.setOnCompletionListener(this);//checks when end

             File path = new File(mPath + "/" + "your file name");

             videoView.setVideoPath(path.getAbsolutePath());
             MediaController mediaController = new MediaController(this);
             mediaController.setMediaPlayer(videoView);
             mediaController.setAnchorView(videoView);

             videoView.setMediaController(mediaController);
             videoView.requestFocus();
             videoView.start();

了解更多信息 http://www.vogella.de/articles/AndroidMedia/article.html

答案 1 :(得分:0)

试试这个:

//class
public class MusicPlayService extends Service {    
   //media player

    private MediaPlayer player;
    //song list
    private ArrayList<Song> songs;
    //current position
    private int songPosn;
    //binder
    private final IBinder musicBind = new MusicBinder(); //very important
    //title of current song
    private String songTitle="";
    private String songAlbumart="";
    private String songDuration="";
    //shuffle flag and random
    private boolean shuffle=false;
    private boolean ispaused=false;
    private Random rand;
    //todo pause music at time of call
    Notification mNotification;
    static RemoteViews mRemoteViews;
    public static int currentPos=0;
    NotificationManager mNotifiManager;
    public static final int NOTIFICATION_IDFOREGROUND_SERVICE=78945;
    public static final String ACTION_STOP="com.yourapp.ACTION_STOP";
    public static final String ACTION_PLAY="com.yourapp.ACTION_PLAY";
    public static final String ACTION_PAUSE="com.yourapp.ACTION_PAUSE";
    public static final String ACTION_RESUME="com.yourapp.ACTION_RESUME";
    public static final String ACTION_NEXT="com.yourapp.ACTION_NEXT";
    public static final String ACTION_PREV="com.yourapp.ACTION_PREV";
    int REQUEST_CODE_STOP=1111;
    int REQUEST_CODE_PAUSE=2222;
    int REQUEST_CODE_RESUME=3333;
    int REQUEST_CODE_NEXT=4444;
    int REQUEST_CODE_PREV=6666;
    int REQUEST_CODE_ACTVITY=5555;
    @Override
    public  void onCreate() {
        super.onCreate();
        //todo//see me
        mNotifiManager=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
        //initialize position
        songPosn=0;
        //random
        rand=new Random();
        //create player
        player = new MediaPlayer();
        player.setAudioStreamType(AudioManager.STREAM_MUSIC);
        //set listeners
        player.setOnPreparedListener(this);
        player.setOnCompletionListener(this);
        player.setOnErrorListener(this);

    }

    //pass song list
    public void setList(ArrayList<Song> theSongs){
        songs=theSongs;
    }
    //binder
    public class MusicBinder extends Binder {
        MusicPlayService getService() {
            return MusicPlayService.this;
        }
    }
    //activity will bind to service
    public IBinder onBind(Intent arg0) {
        return musicBind;
    }
    //release resources when unbind
    @Override
    public boolean onUnbind(Intent intent){
        //player.stop();
        //player.release();
        return false;
    }
    //set the song
    public void setSong(int songIndex){
        songPosn=songIndex;
    }
    //play a song
    public void playSong(){
        //play
        player.reset();
        //get song
        Song playSong = songs.get(songPosn);
        //get title
        songTitle=playSong.DISPLAY_NAME;
        songDuration=playSong.DURATION;
        songAlbumart=playSong.ALBUMART;
        //set the data source
        try{
            player.setDataSource(playSong.Path);
        }
        catch(Exception e){
            Log.e("MUSIC SERVICE", "Error setting data source", e);
        }
        player.prepareAsync(); //this will call onPrepared
    }
    @Override
    public void onPrepared(MediaPlayer mp) {
        //start playback
        mp.start();
        //notification
        showControllerInNotification(songTitle, songDuration,songAlbumart);
    }
    //playback methods
    public int getPosn(){
        return player.getCurrentPosition();
    }

    public int getDur(){
        return player.getDuration();
    }

    public boolean isPng(){
        return player.isPlaying();
    }

    public void pausePlayer(){
        player.pause();
    }
    public void stopPlayer(){
        player.stop();
    }

    public void seek(int posn){
        player.seekTo(posn);
    }
    public void go(){
        player.start();
    }

    //skip to previous track
    public void playPrev(){
        songPosn--;
        if(songPosn<0) songPosn=songs.size()-1;
        playSong();
    }

    //skip to next
    public void playNext(){
        if(shuffle){
            int newSong = songPosn;
            while(newSong==songPosn){
                newSong=rand.nextInt(songs.size());
            }
            songPosn=newSong;
        }
        else{
            songPosn++;
            if(songPosn>=songs.size()) songPosn=0;
        }
        playSong();
    }
    //toggle shuffle
    public void setShuffle(){
        if(shuffle) shuffle=false;
        else shuffle=true;
    }
    public int onStartCommand(Intent intent, int flags, int startId) {
        if (intent != null) {
            String action = intent.getAction();

            if (!TextUtils.isEmpty(action)) {
                if (action.equals(ACTION_PLAY)) {
                        ispaused=false;
                        playSong();

                }else if(action.equals(ACTION_PAUSE)) {
                    pausePlayer();
                    currentPos = getPosn();
                    ispaused=true;


                }else if(action.equals(ACTION_RESUME)) {
                    seek(currentPos);

                    ispaused=false;
                    go();

                }
                else if(action.equals(ACTION_STOP)) {
                    ispaused=false;
                    player.stop();
                    mNotifiManager.cancel(NOTIFICATION_IDFOREGROUND_SERVICE);
                }
                else if(action.equals(ACTION_NEXT)) {
                    ispaused=false;
                    playNext();
                }
                else if(action.equals(ACTION_PREV)) {
                    ispaused=false;
                    playPrev();
                }
            }
        }

        return super.onStartCommand(intent, flags, startId);

    }
    @Override
    public void onDestroy() {
        //player.stop();
        stopForeground(true);
    }
    @Override
    public void onLowMemory() {

    }
    private void showControllerInNotification(String title,String duration,String songAlbumart) {
        PendingIntent pendingIntent = null;
        Intent intent = null;

        //Inflate a remote view with a layout which you want to display in the notification bar.
        if (mRemoteViews == null) {
            mRemoteViews = new RemoteViews(getPackageName(),
                    R.layout.status_bar);
        }
        if(songAlbumart=="")
        mRemoteViews.setImageViewResource(R.id.status_bar_album_art,R.drawable.musicplayericon);
        else {
            //Drawable image = Drawable.createFromPath(songAlbumart);
            Bitmap bitmap = BitmapFactory.decodeFile(songAlbumart);
            mRemoteViews.setImageViewBitmap(R.id.status_bar_album_art, bitmap);
            //mRemoteViews.setImageViewResource(R.id.status_bar_album_art, image);
        }
        mRemoteViews.setTextViewText(R.id.status_bar_track_name, title);

        float dua= Float.valueOf(duration);
        dua=dua/60000;
        //mRemoteViews.setTextViewText(R.id.status_bar_progress_music, String.format("%.2f", dua));
        mRemoteViews.setImageViewResource(R.id.status_bar_playpause, R.drawable.apollo_holo_dark_pause);
        mRemoteViews.setImageViewResource(R.id.status_bar_next, R.drawable.apollo_holo_dark_next);
        //Define what you want to do after clicked the button in notification.
        //Here we launcher a service by an action named "ACTION_STOP" which will stop the music play.
        intent = new Intent(ACTION_STOP);
        pendingIntent = PendingIntent.getService(getApplicationContext(),
                REQUEST_CODE_STOP, intent,
                PendingIntent.FLAG_UPDATE_CURRENT);
        mRemoteViews.setOnClickPendingIntent(R.id.status_bar_collapse,
                pendingIntent);

        //mRemoteViews.setBackgroundColor(0x0000FF00);
        Intent intentpause = new Intent(ACTION_PAUSE);
        PendingIntent pendingIntentpause = PendingIntent.getService(getApplicationContext(),
                REQUEST_CODE_PAUSE, intentpause,
                PendingIntent.FLAG_UPDATE_CURRENT);
        mRemoteViews.setOnClickPendingIntent(R.id.status_bar_playpause,
                pendingIntentpause);

        Intent intentnext = new Intent(ACTION_NEXT);
        PendingIntent pendingIntentnext = PendingIntent.getService(getApplicationContext(),
                REQUEST_CODE_NEXT, intentnext,
                PendingIntent.FLAG_UPDATE_CURRENT);
        mRemoteViews.setOnClickPendingIntent(R.id.status_bar_next,
                pendingIntentnext);

        Intent intentprev = new Intent(ACTION_PREV);
        PendingIntent pendingIntentprev = PendingIntent.getService(getApplicationContext(),
                REQUEST_CODE_PREV, intentprev,
                PendingIntent.FLAG_UPDATE_CURRENT);
        mRemoteViews.setOnClickPendingIntent(R.id.status_bar_prev,
                pendingIntentprev);


        Intent intentactivity=new Intent(getApplicationContext(),ListMusic.class);
        PendingIntent pendingIntentActivity = PendingIntent.getActivity(getApplicationContext(),
                REQUEST_CODE_ACTVITY, intentactivity,
                PendingIntent.FLAG_UPDATE_CURRENT);
        //Create the notification instance.
        mNotification = new NotificationCompat.Builder(getApplicationContext())
                .setSmallIcon(R.drawable.notificationimage)
                .setOngoing(true)
                .setWhen(System.currentTimeMillis())
                .setContentIntent(pendingIntentActivity)
                .setContent(mRemoteViews)
                .build();
        //mNotification.bigContentView=mRemoteViews;
        //Show the notification in the notification bar.

        mNotifiManager.notify(NOTIFICATION_IDFOREGROUND_SERVICE, mNotification);
    }


    @Override
    public void onCompletion(MediaPlayer mp) {
        //check if playback has reached the end of a track
        if(player.getCurrentPosition()>0){
            mp.reset();
            playNext();
            Log.e("MUSIC PLAYER", "Staring Next Song:"+songTitle);
        }
    }

    @Override
    public boolean onError(MediaPlayer mp, int what, int extra) {
        Log.e("MUSIC PLAYER", "Playback Error");
        mp.reset();
        return false;
    }

}