服务MusicPlayerService的具体实现

#1.bindService(intent,con,BIND_AUTO_CREATE)使得MusicPlayerService的OnCreate()方法执行(但是OnStartCommand()方法不会执行)。
在OnCreate()中获取音乐列表:

 @Override
    public void onCreate() {
        super.onCreate();
//        获得音乐列表
        getDataFromLocal();
    }
    /**
     * 从本地的sdcard得到数据
     * //1.遍历sdcard,后缀名
     * //2.从内容提供者里面获取视频
     * //3.如果是6.0的系统,动态获取读取sdcard的权限
     */
    private void getDataFromLocal() {
//        因为服务本身默认在主线程执行,所以需要开启新线程
        new Thread(){
            @Override
            public void run() {
                super.run();
//                isGrantExternalRW((Activity) context);
//                SystemClock.sleep(2000);
                mediaItems = new ArrayList<>();
                ContentResolver resolver = getContentResolver();//服务本身就是一个Context
                Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                String[] objs = {
                        MediaStore.Audio.Media.DISPLAY_NAME,//视频文件在sdcard的名称
                        MediaStore.Audio.Media.DURATION,//视频总时长
                        MediaStore.Audio.Media.SIZE,//视频的文件大小
                        MediaStore.Audio.Media.DATA,//视频的绝对地址
                        MediaStore.Audio.Media.ARTIST,//歌曲的演唱者

                };
                Cursor cursor = resolver.query(uri, objs, null, null, null);
                if(cursor != null){
                    while (cursor.moveToNext()){

                        MediaItem mediaItem = new MediaItem();

                        mediaItems.add(mediaItem);//写在上面

                        String name = cursor.getString(0);//视频的名称
                        mediaItem.setName(name);

                        long duration = cursor.getLong(1);//视频的时长
                        mediaItem.setDuration(duration);

                        long size = cursor.getLong(2);//视频的文件大小
                        mediaItem.setSize(size);

                        String data = cursor.getString(3);//视频的播放地址
                        mediaItem.setData(data);

                        String artist = cursor.getString(4);//艺术家
                        mediaItem.setArtist(artist);
                    }
                    cursor.close();
                }
            }
        }.start();

    }

#2.开始播放音频

  package com.example.player.service;

import android.app.Service;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.IBinder;
import android.os.RemoteException;
import android.provider.MediaStore;
import android.widget.Toast;

import com.example.player.IMusicPlayerService;
import com.example.player.domain.MediaItem;
import com.example.player.utils.LogUtil;

import java.io.IOException;
import java.util.ArrayList;

public class MusicPlayerService extends Service {
    public MusicPlayerService() {
    }
    private ArrayList<MediaItem> mediaItems;//音乐列表
    /**
     * 当前播放的音频文件对象
     */
    private MediaItem mediaItem;
    private int position;
    /**
     * 播放音乐
     */
    private MediaPlayer mediaPlayer;



    @Override
    public void onCreate() {
        super.onCreate();
//        获得音乐列表
        getDataFromLocal();
    }
    /**
     * 从本地的sdcard得到数据
     * //1.遍历sdcard,后缀名
     * //2.从内容提供者里面获取视频
     * //3.如果是6.0的系统,动态获取读取sdcard的权限
     */
    private void getDataFromLocal() {
//        因为服务本身默认在主线程执行,所以需要开启新线程
        new Thread(){
            @Override
            public void run() {
                super.run();
//                isGrantExternalRW((Activity) context);
//                SystemClock.sleep(2000);
                mediaItems = new ArrayList<>();
                ContentResolver resolver = getContentResolver();//服务本身就是一个Context
                Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                String[] objs = {
                        MediaStore.Audio.Media.DISPLAY_NAME,//视频文件在sdcard的名称
                        MediaStore.Audio.Media.DURATION,//视频总时长
                        MediaStore.Audio.Media.SIZE,//视频的文件大小
                        MediaStore.Audio.Media.DATA,//视频的绝对地址
                        MediaStore.Audio.Media.ARTIST,//歌曲的演唱者

                };
                Cursor cursor = resolver.query(uri, objs, null, null, null);
                if(cursor != null){
                    while (cursor.moveToNext()){

                        MediaItem mediaItem = new MediaItem();

                        mediaItems.add(mediaItem);//写在上面

                        String name = cursor.getString(0);//视频的名称
                        mediaItem.setName(name);

                        long duration = cursor.getLong(1);//视频的时长
                        mediaItem.setDuration(duration);

                        long size = cursor.getLong(2);//视频的文件大小
                        mediaItem.setSize(size);

                        String data = cursor.getString(3);//视频的播放地址
                        mediaItem.setData(data);

                        String artist = cursor.getString(4);//艺术家
                        mediaItem.setArtist(artist);
                    }
                    cursor.close();
                }
            }
        }.start();

    }

    @Override
    public IBinder onBind(Intent intent) {
        return stub;
    }

    IMusicPlayerService.Stub stub = new IMusicPlayerService.Stub() {
        MusicPlayerService service = MusicPlayerService.this;
        @Override
        public void stop() throws RemoteException {
            service.stop();
        }
        @Override
        public void start() throws RemoteException {
            service.start();
        }
        @Override
        public void setPlayMode(int mode) throws RemoteException {
            service.setPlayMode(mode);
        }
        @Override
        public void pre() throws RemoteException {
            service.pre();
        }
        @Override
        public void pause() throws RemoteException {
            service.pause();
        }
        @Override
        public void openAudio(int position) throws RemoteException {
            service.openAudio(position);
        }
        @Override
        public void next() throws RemoteException {
            service.next();
        }
        @Override
        public int getPlayMode() throws RemoteException {
            // TODO Auto-generated method stub
            return service.getPlayMode();
        }
        @Override
        public int getDuration() throws RemoteException {
            // TODO Auto-generated method stub
            return service.getDuration();
        }
        @Override
        public int getCurrentPosition() throws RemoteException {
            // TODO Auto-generated method stub
            return service.getCurrentPosition();
        }
        @Override
        public String getAudioName() throws RemoteException {
            // TODO Auto-generated method stub
            return service.getName();
        }
        @Override
        public String getArtistName() throws RemoteException {
            // TODO Auto-generated method stub
            return service.getArtist();
        }
    };

    /**
     * 根据位置打开一个音频并且播放
     *
     * @param position
     */
    public void openAudio(int position) {
        LogUtil.e("public void openAudio(int position) {");
        this.position = position;
        if (mediaItems != null && mediaItems.size() > 0) {

            mediaItem = mediaItems.get(position);

            if (mediaPlayer != null) {
//                mediaPlayer.release();
                mediaPlayer.reset();
            }

            try {
                mediaPlayer = new MediaPlayer();
                //设置监听:播放出错,播放完成,准备好
                mediaPlayer.setOnPreparedListener(new MyOnPreparedListener());
                mediaPlayer.setOnCompletionListener(new MyOnCompletionListener());
                mediaPlayer.setOnErrorListener(new MyOnErrorListener());
                mediaPlayer.setDataSource(mediaItem.getData());
                mediaPlayer.prepareAsync();
            } catch (IOException e) {
                e.printStackTrace();
            }


        } else {
            Toast.makeText(MusicPlayerService.this, "还没有数据", Toast.LENGTH_SHORT).show();
        }

    }
    class MyOnErrorListener implements MediaPlayer.OnErrorListener {

        @Override
        public boolean onError(MediaPlayer mp, int what, int extra) {
            next();
            return true;
        }
    }

    class  MyOnCompletionListener implements MediaPlayer.OnCompletionListener {

        @Override
        public void onCompletion(MediaPlayer mp) {
            next();
        }
    }

    class MyOnPreparedListener implements MediaPlayer.OnPreparedListener {

        @Override
        public void onPrepared(MediaPlayer mp) {
            start();
        }
    }

    /**
     * 开始播放音频
     */
    public void start() {
        mediaPlayer.start();
    }

    /**
     * 暂停
     */
    public void pause() {
        mediaPlayer.pause();
    }
    public void stop() {
    }

    /**
     * 得到当前的播放进度
     *
     * @return
     */
    private int getCurrentPosition() {
        return mediaPlayer.getCurrentPosition();
    }


    /**
     * 得到当前音频的总时长
     *
     * @return
     */
    private int getDuration() {
        return mediaPlayer.getDuration();
    }

    /**
     * 得到艺术家
     *
     * @return
     */
    private String getArtist() {
        return mediaItem.getArtist();
    }

    /**
     * 得到歌曲名字
     *
     * @return
     */
    private String getName() {
        return mediaItem.getName();
    }


    /**
     * 得到歌曲播放的路径
     *
     * @return
     */
    private String getAudioPath() {
        return mediaItem.getData();
    }
    /**
     * 播放下一首歌曲
     */
    public void next() {
    }

    /**
     * 播放上一首歌曲
     */
    public void pre() {
    }

    /**
     * 得到播放模式
     */
    public int getPlayMode() {
        return 0;
    }

    /**
     * 设置播放模式
     */
    public void setPlayMode(int mode) {
    }


}

你可能感兴趣的:(android音乐播放器)