Rhythm韵:自制音乐app(1f)

来源:互联网 发布:nba英雄网络链接 编辑:程序博客网 时间:2024/06/05 11:04

先实现最重要的功能:能播放音乐。。

工具类MusicDB,getMusicInfo()用于查找设备中的音乐文件,返回到list

public static List<Music> getMp3Infos(Context context) {    Cursor cursor = context.getContentResolver().query(            MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null,            MediaStore.Audio.Media.DEFAULT_SORT_ORDER);    List<Music> musics = new ArrayList<Music>();    for (int i = 0; i < cursor.getCount(); i++) {        Music music = new Music();        cursor.moveToNext();        long id = cursor.getLong(cursor                .getColumnIndex(MediaStore.Audio.Media._ID));   //音乐id        String title = cursor.getString((cursor                .getColumnIndex(MediaStore.Audio.Media.TITLE)));//音乐标题        String artist = cursor.getString(cursor                .getColumnIndex(MediaStore.Audio.Media.ARTIST));//艺术家        long duration = cursor.getLong(cursor                .getColumnIndex(MediaStore.Audio.Media.DURATION));//时长        long size = cursor.getLong(cursor                .getColumnIndex(MediaStore.Audio.Media.SIZE));  //文件大小        String url = cursor.getString(cursor                .getColumnIndex(MediaStore.Audio.Media.DATA));              //文件路径        int isMusic = cursor.getInt(cursor                .getColumnIndex(MediaStore.Audio.Media.IS_MUSIC));//是否为音乐        if (isMusic != 0) {     //只把音乐添加到集合当中            music.setId(id);            music.setTitle(title);            music.setArtist(artist);            music.setDuration(duration);            music.setSize(size);            music.setUrl(url);            musics.add(music);        }    }    return musics;}
其中Music类中封装了各种音乐文件信息。

在mainactivity中设置listview显示歌曲

public View getView(int position, View convertView, ViewGroup parent) {    convertView = View.inflate(getApplicationContext(), R.layout.music_item, null);    TextView title = (TextView) convertView.findViewById(R.id.tv_tilte);    TextView artist = (TextView) convertView.findViewById(R.id.tv_artist);    title.setText(musicList.get(position).getTitle());    artist.setText(musicList.get(position).getArtist());    return convertView;}
设置条目点击事件,开启service播放音乐

private class MusicListItemClickListener implements AdapterView.OnItemClickListener {    @Override    public void onItemClick(AdapterView<?> parent, View view, int position,                            long id) {        if(musicList != null) {            Music music = musicList.get(position);            Log.d("music-->", music.toString());            Intent intent = new Intent();            intent.putExtra("url", music.getUrl());            intent.putExtra("MSG", AppConstant.PlayerMsg.PLAY_MSG);            intent.setClass(MainActivity.this, PlayerService.class);            startService(intent);       //启动服务        }    }}
Appconstant是个应用常量类,

public class AppConstant {    public class PlayerMsg {        public static final int PLAY_MSG = 1;       //播放        public static final int PAUSE_MSG = 2;      //暂停        public static final int STOP_MSG = 3;       //停止        public static final int CONTINUE_MSG = 4;   //继续        public static final int PRIVIOUS_MSG = 5;   //上一首        public static final int NEXT_MSG = 6;       //下一首        public static final int PROGRESS_CHANGE = 7;//进度改变        public static final int PLAYING_MSG = 8;    //正在播放    }
service中播放音乐的设置:

public class PlayerService extends Service{    private MediaPlayer mediaPlayer =  new MediaPlayer();       //媒体播放器对象    private String path;                        //音乐文件路径    private boolean isPause;                    //暂停状态    @Override    public IBinder onBind(Intent arg0) {        return null;    }    @Override    public int onStartCommand(Intent intent, int flags, int startId) {        if(mediaPlayer.isPlaying()) {            stop();        }        path = intent.getStringExtra("url");        int msg = intent.getIntExtra("MSG", 0);        if(msg == AppConstant.PlayerMsg.PLAY_MSG) {            play(0);        } else if(msg == AppConstant.PlayerMsg.PAUSE_MSG) {            pause();        } else if(msg == AppConstant.PlayerMsg.STOP_MSG) {            stop();        }        return super.onStartCommand(intent, flags, startId);    }    /**     * 播放音乐     * @param position     */    private void play(int position) {        try {            mediaPlayer.reset();//把各项参数恢复到初始状态            mediaPlayer.setDataSource(path);            mediaPlayer.prepare();  //进行缓冲            mediaPlayer.setOnPreparedListener(new PreparedListener(position));//注册一个监听器        }        catch (Exception e) {            e.printStackTrace();        }    }    /**     * 暂停音乐     */    private void pause() {        if (mediaPlayer != null && mediaPlayer.isPlaying()) {            mediaPlayer.pause();            isPause = true;        }    }    /**     * 停止音乐     */    private void stop(){        if(mediaPlayer != null) {            mediaPlayer.stop();            try {                mediaPlayer.prepare(); // 在调用stop后如果需要再次通过start进行播放,需要之前调用prepare函数            } catch (Exception e) {                e.printStackTrace();            }        }    }    @Override    public void onDestroy() {        if(mediaPlayer != null){            mediaPlayer.stop();            mediaPlayer.release();        }    }    /**     *     * 实现一个OnPrepareLister接口,当音乐准备好的时候开始播放     *     */    private final class PreparedListener implements MediaPlayer.OnPreparedListener {        private int positon;        public PreparedListener(int positon) {            this.positon = positon;        }        @Override        public void onPrepared(MediaPlayer mp) {            mediaPlayer.start();    //开始播放            if(positon > 0) {    //如果音乐不是从头播放                mediaPlayer.seekTo(positon);            }        }    }}
这些都网上找的,没什么特别的

一定要注意的是!!!

四大组件一定要在Mainfest中注册,service没有注册也不会报错,刚开始播放没有声音,查了半天


0 0