【安卓入门不久 新手一枚】最近在写一个播放器 照着天天动听的来 但远比不上 现在实现的功能也只是少部分 回过头来 想记录下这个过程中的收获
首先 在网上找了好几个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>
发现好多问题不懂哈~欢迎指教