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

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

工具类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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值