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是个应用常量类,
service中播放音乐的设置: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; //正在播放 }
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
- Rhythm韵:自制音乐app(1f)
- mac 自制app 打包安装工具(1)
- 自制音乐播放器
- Android音乐、视频类APP常用控件:DraggablePanel(1)
- 小白也能自制APP
- 自制智能手机电话APP
- 自制短息APP
- 音乐app的分析(例:QQ音乐)
- 音乐应用(App)用户和市场分析
- 网易云音乐App(iOS)分析
- 自制的通讯录APP(SQLite的应用)
- mac 自制app 打包安装工具(2)
- 虾米音乐--自制博客播放器
- 自制一个简单的音乐播放器
- 自制os(1)-bootloader
- android自制小说阅读APP
- iboltmusic 音乐下载app
- 某音乐APP总结
- 参数数组和普通数组
- 实现jQuery底层链式编程(二)
- 张宴的博客nginx+php+mysql搭建篇
- 游标
- 一个java数学题,给定一个数组,除了一个数出现1次之外,其余数都出现3次,输出出现一次的那个数。
- Rhythm韵:自制音乐app(1f)
- hdoj1084What Is Your Grade?(sort+结构体)
- hdu 5726 (线段树 GCD RMQ)多校第一场1004
- usb-c接口与USB接口的区别
- 五大常用算法之四:回溯法
- Android系统分享
- Scrapy框架结合Spynner采集需进行js,ajax动态加载的网页并提取网页信息(以采集微信公众号文章列表为例)
- 反射类的学习
- Android zygote