安卓本地播放器的实现一

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

首先 在网上找了好几个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>
发现好多问题不懂哈~欢迎指教


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值