十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
Android开发中如何实现一个音乐播放器功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
成都创新互联 - 眉山服务器托管,四川服务器租用,成都服务器租用,四川网通托管,绵阳服务器托管,德阳服务器托管,遂宁服务器托管,绵阳服务器托管,四川云主机,成都云主机,西南云主机,眉山服务器托管,西南服务器托管,四川/成都大带宽,成都机柜租用,四川老牌IDC服务商
需求1:将内存卡中的MP3音乐读取出来并显示到列表当中
1.从数据库中查询所有音乐数据,保存到List集合当中,List当中存放的是Mp3Info对象
2.迭代List集合,把每一个Mp3Info对象的所有属性,保存到Map对象当中
3.定义一个List集合,把Map对象添加到List集合当中
4.通过定义一个SimpleAdpter,调用setAdpter方法,将数据显示到列表当中
/** * 用于从数据库中查询歌曲的信息,保存在List当中 * * @return */ public ListgetMp3Infos() { Cursor cursor = getContentResolver().query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER); List mp3Infos = new ArrayList (); for (int i = 0; i < cursor.getCount(); i++) { Mp3Info mp3Info = new Mp3Info(); 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) { //只把音乐添加到集合当中 mp3Info.setId(id); mp3Info.setTitle(title); mp3Info.setArtist(artist); mp3Info.setDuration(duration); mp3Info.setSize(size); mp3Info.setUrl(url); mp3Infos.add(mp3Info); } } return mp3Infos; }
/** * 填充列表 * @param mp3Infos */ public void setListAdpter(Listmp3Infos) { List > mp3list = new ArrayList >(); for (Iterator iterator = mp3Infos.iterator(); iterator.hasNext();) { Mp3Info mp3Info = (Mp3Info) iterator.next(); HashMap map = new HashMap (); map.put("title", mp3Info.getTitle()); map.put("Artist", mp3Info.getArtist()); map.put("duration", String.valueOf(mp3Info.getDuration())); map.put("size", String.valueOf(mp3Info.getSize())); map.put("url", mp3Info.getUrl()); mp3list.add(map); } mAdapter = new SimpleAdapter(this, mp3list, R.layout.music_list_item_layout, new String[] { "title", "Artist", "duration" }, new int[] { R.id.music_title, R.id.music_Artist, R.id.music_duration }); mMusiclist.setAdapter(mAdapter); }
实现效果如图:
需求2:点击列表的每一项,启动一个服务来播放音乐
1. 注册条目点击监听器OnItemClickListener
2. 定义一个实现OnItemClickListener接口的内部类
3. 定义一个继承Service的服务类PlayerServie
1. 注册条目点击监听器OnItemClickListener
mMusiclist = (ListView) findViewById(R.id.music_list); mMusiclist.setOnItemClickListener(new MusicListItemClickListener()); mp3Infos = getMp3Infos(); setListAdpter(getMp3Infos());
2. 定义一个实现OnItemClickListener接口的内部类
private class MusicListItemClickListener implements OnItemClickListener { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if(mp3Infos != null) { Mp3Info mp3Info = mp3Infos.get(position); Log.d("mp3Info-->", mp3Info.toString()); Intent intent = new Intent(); intent.putExtra("url", mp3Info.getUrl()); intent.putExtra("MSG", AppConstant.PlayerMsg.PLAY_MSG); intent.setClass(MainActivity.this, PlayerService.class); startService(intent); //启动服务 } } }
3. 定义一个继承Service的服务类PlayerServie(未完善的Service类)
package com.wwj.sb.service; import android.annotation.SuppressLint; import android.app.Service; import android.content.Intent; import android.media.MediaPlayer; import android.media.MediaPlayer.OnPreparedListener; import android.os.IBinder; import com.wwj.sb.domain.AppConstant; @SuppressLint("NewApi") 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 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); } } } }
关于Android开发中如何实现一个音乐播放器功能问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注创新互联行业资讯频道了解更多相关知识。