安卓本地播放器的实现一

来源:互联网 发布:拉菲尔定律工资计算法 编辑:程序博客网 时间:2024/06/08 05:09

【安卓入门不久 新手一枚】最近在写一个播放器 照着天天动听的来 但远比不上 现在实现的功能也只是少部分 回过头来 想记录下这个过程中的收获

首先 在网上找了好几个demo 最终确定的是一个叫天籁之音的apk的源码(反编译的代码看不懂- -)下载地址是http://www.apkbus.com/android-102583-1-1.html

以此为基础开始了我的播放器开发之旅

现在回过去看 已经差不多被改的面目全非了哈 不过还是感谢其中的歌词显示部分省去了很大的力气 还有左右滑动切页面(目前还没明白原理)

首先 是把单独播放的界面加上 结果就是要在列表界面和播放界面实现播放的同步 使用了大量的广播去同步信息 也不知道是好还坏 

第一个问题是获取歌曲时间长的问题 测试机器不同 在某台机器上无法获取 后来问了下 才知道meidaPlayer也可以获取到时长 但这样一来 就打乱了之前的构想 在此之前 是有一个MusicList的工具类 用来获取歌曲信息 关键代码如下:

public static List<Music> getMusicData(Context context) {List<Music> musicList = new ArrayList<Music>();ContentResolver cr = context.getContentResolver();if (cr != null) {// 获取所有歌曲Cursor cursor = cr.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null,null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER);if (null == cursor) {return null;}if (cursor.moveToFirst()) {do {Music m = new Music();String title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));String singer = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));if ("<unknown>".equals(singer)) {singer = "未知艺术家";}String url = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));long time = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION));//System.out.println("读到的歌曲时长"+time);String id = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media._ID));String album=cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM));String album_id=cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));String name = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME));String sbr = name.substring(name.length() - 3,name.length());//Log.e("--------------", sbr+"name:"+name);if (sbr.equals("mp3")) {m.setTitle(title);m.setArtist(singer);m.setDuration(Long.toString(time));m.setPath(url);m.setId(id);m.setAlbum(album);m.setAlbum_id(album_id);musicList.add(m);}} while (cursor.moveToNext());}}return musicList;}
获取后的歌曲信息都封装成了一个Music的实体类 但由于时长获取不到 只好在service里的mediaPlayer获取后再发广播给activity去更新显示的时长(总感觉这个地方可以优化- -)于是不管是返回页面 还是去播放页面 这个时长的信息就要被广播来广播去的。。。

然后是进度条的问题 之前一直不动 以为又是机器问题 后来一个朋友点破 说是时长获取不到 进度条设置的max也是0 才明白过来 后来进度条的问题过了很久才解决 最后发现是xml文件的问题 照自己的理解 android:progressDrawable="@drawable/seek_background"的属性是指定进度条的背景和进度的样式的 android:thumb="@drawable/seekbar_thumb"是指定滑块的样式的 因为打算不要滑块 就把thumb设定为一张空白的图 结果发现进度条就不走了不懂为什么 感觉thumb好关键的说 最后seek_background采用的是

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">     <item android:id="@android:id/background">         <shape >             <corners android:radius="10dip"/>             <gradient android:startColor="#ffffffff"                 android:centerColor="#ff000000"                 android:endColor="#ff808a87"                 android:centerX="0.45"                 android:angle="270"                 />         </shape>     </item>     <item android:id="@android:id/progress">         <clip >         <shape>             <corners android:radius="10dip"/>             <gradient android:startColor="#ffffffff"                 android:centerColor="#ffffff00"                 android:endColor="#ffaabd00"                 android:centerX="0.45"                 android:angle="270"                 />         </shape>             </clip>     </item>> </layer-list>
发现好多问题不懂哈~欢迎指教