用于设置歌曲播放进度条和显示当前播放时间和总时间。第四个用于显示播放控制和音量进度条。
(3)界面的初始化操作
Android的每一个可视化界面,都有其的唯一的布局配置文件,该文件里面有各种布局方式,和各种资源文件如图像,文字,颜色的引用,程序在运行时,可以通过代码对各配置文件进行读取。这样就可以形成不同的可视化界面和炫丽的效果。播放器主界面是一个Activity,Android工程在每个activity启动的时候会首先执行Oncreate()方法,如下代码是主要执行界面的初始化操作
@Override
Public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.play);}//设置界面布局
Activity设置布局的方法:Context.setContentView(layoutResID),
参数为资源ID,该Id在工程目录res/layout下,主界面布局文件名为play.xml。
3.3功能实现方法
Android项目目录结构如右图所示
在Firstpage中初始化列表界面,
设置获取歌曲信息和显示.实现UI和数据
的绑定并且设定列表点击响应事件处理方法
MusicListAdapter.java,显示歌曲信息
TimetoStr用于修改时间格式
play.java主要是用于播放歌曲功能实现
(1)播放列表的显示和响应
在Firstpage中初始化列表界面,设置获取歌曲信息和显示,在MusicListAdapter.java中通过重写ListActivity的onResume方法,构造一个新的MusicListAdapter对象,调用Activity的SetListAdapter方法实现ListView和歌曲的绑定,并且设定列表点击响应事件处理方法。
(a)通过数据共享存储Content Providers机制 获取歌曲信息
(1 Content Providers是所有应用程序之间数据存储和检索的一个桥梁,它的作用就是使得各个应用程序之间实现数据共享。在Android中,Content Providers是一个特殊的存储数据的类型,它提供了一套标准的接口用来获取、操作数据。Android 为常用的数据类型(如:音视频、图片和联系方式等)提供了大量的Content Provider。它们被定义在android.provider包下面。
*所有的Content Providers都会实现一些共同的接口,包括数据的查询、添加、更改和删除。应用可以通过一个唯一的ContentResolver接口来使用具体的某个Content Providers。可以通过getContentResolver()方法来取得一个ContentResolver对象,然后就可以用ContentResolver提供的方法来操作你需要的Content Provider了。
ContentResolver resolver = getContentResolver();
对于媒体文件就提供了MediaScanner、MediaProvider、MediaStore.当手机开机或是插入SD卡时,系统会扫描SD卡和手机内存上的媒体文件,并且将这些媒体文件的信息存放起来,通过MediaStore等方式提供给用户。
(2 查询数据 获取歌曲信息
1.要查询Content Providers的内容,可以使用ContentResolver.query()方法
query(Uri uri,String[] projection,String[] selectionArgs,String sortOrder);通过uri进行查询,返回一个cursor
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;外部存储卡上的所有音乐
2.读取查询的数据由Cursor对象的方法来操作
//获取歌曲信息
//得到ContentResolver对象通过query方法取得SD卡上所有的音乐的信息
private Cursor allSongs(){
if(cursor != null)
return cursor;
//得到ContentResolver对象
ContentResolver resolver = getContentResolver();
//从Content Provider中获得SD卡上全部歌曲信息
cursor = resolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
null, null, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
//查询并定位指针
return cursor;
}
(b)把音乐以列表方式显示出来
方法是 通过SimpleCursorAdapter实现UI和数据的绑定,然后显示歌曲信息
(1 SimpleCursorAdapter构造函数 适配器 Adapter
Cursor可以与适配器(Adapter)相结合,将Cursor指向的数据自动填充到Adapter所在的UI控件中。
public MusicListAdapter(Context context, int layout, Cursor c,
String[] from, int[] to)
Context:当前的程序的上下文对象 当前类所用到的对象
layout: 用来描述显示在适配器控件上的布局文件R类的应用
from : 根据需要显示出的列名组成的字符串数组
to : 由layout 所指定的布局文件中子控件的ID所组成的整型数组,与from相对应。
(2 生成MusicListAdapter对象并与UI绑定
通过重写firstpage的onResume方法,构造一个新的MusicListAdapter对象,调用Activity的SetListAdapter方法实现ListView和歌曲的绑定,这样每次从播放界面返回到播放列表时都能够执行一次列表更新。
@Override
protected void onResume() {
super.onResume();
cursor = allSongs();//获取歌曲全部信息
//创建Adapter并绑定到ListView
SimpleCursorAdapter adapter = new MusicListAdapter(this,
R.layout.songabout, cursor,new String[] {},new int[] {});
//构造一个MusicListAdapter对象
setListAdapter(adapter); //实现ListView和歌曲的绑定
}
(3 通过增加一个新的类MusicListAdapter继承SimpleCursorAdapter类,显示歌曲信息(歌名歌手专辑播放时间)重写bindView用于修改时间格式
其中,用cursor.get方法来获取歌曲具体信息。
程序片段如下
public class MusicListAdapter extends SimpleCursorAdapter{
//调用子类构造函数需要先调用父类的构造函数
public MusicListAdapter(Context context, int layout, Cursor c,
String[] from, int[] to) {
super(context, layout, c, from, to);
}
//重写public void bindView()函数
public void bindView(View view, Context context, Cursor cursor) {
super.bindView(view, context, cursor);
//通过获取id来取得控件对象(歌曲,歌手,专辑,播放时间)
TextView titleView =(TextView)view.findViewById(R.id.track_name);
TextView artistView = (TextView)view.findViewById(R.id.artist);
TextView albumView = (TextView)view.findViewById(R.id.album);
TextView durationView =(TextView)view.findViewById(R.id.duration);
//获取歌曲信息并且定义所要显示的内容,显示歌曲歌手专辑播放时间
titleView.setText(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE)));//得到歌名信息并且显示
artistView.setText(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST)));//得到歌手信息并且显示
albumView.setText(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM)));//得到专辑信息并且显示
long duration = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));//得到播放时间信息
durationView.setText(TimetoStr.timeToString(duration));//显示播放时间
}
(4 MediaStore.Audio.Media.DURATION返回的歌曲时间单位是毫秒,需要修改成"分:秒"的形式,把它处理成一个类TimetoStr.java方便调用
public class TimetoStr {
public static String timeToString(long duration) {
if(duration < 0)
return "00:00";//如果时间小于0则返回显示为00:00
StringBuffer sb = new StringBuffer();//生成字符串暂存对象
long m = duration / (60 * 1000);//设定分
sb.append(m < 10 ? "0" + m : m);//分小于十时显示
sb.append(":");
long s = (duration % (60 * 1000)) / 1000;//设定秒
sb.append(s < 10 ? "0" + s : s);//秒小于十时的显示
return sb.toString();//以字符串格式返回
}
}
(c)列表点击事件处理
通过点击列表中个某一个歌曲实现跳转到播放界面的程序。
1 .通过重 ……(未完,全文共44666字,当前仅显示11763字,请阅读下面提示信息。收藏《毕业论文:ANDROID音乐播放器》)