Android第三次作业
一、界面截图
针对上面音乐名称乱码,还想解释一下。(因为音乐当中还有假名!!!)
APP界面分为两部分,一个为程序运行的主界面,一个为音乐信息的分界面,界面设计分别如下:
1. 程序运行的主界面——(上一首,下一首,播放,暂停,停止,音乐列表)
2. 音乐信息的分界面——(相信你已经看明白这个界面的作用了)
二、关键代码
andriod开发和其他开发一样,需要有一个相对完整的逻辑。
1. 音乐信息存放类
- 既然是音乐,肯定有音乐名,歌手,音乐时长等等信息吧!该类就是存放这些信息的!代码如下:
package com.example.hp.myapplication;
public class MusicList {
public String filename;//文件名
public String name;//歌名
public String singer;//歌手
public String path;//歌曲路径
public int duration;//歌曲总时长
public long size;//歌曲大小
}
2.本地音乐信息存放类
- 该类的主要作用为查询并存放本地音乐,返回值类型为list。
- 使用cursor将查询结果封锁在cursor对象中,支持左右移动。核心代码如下:
- 详细代码参见第三部分链接
Cursor cursor=context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,null,null,null,MediaStore.Audio.AudioColumns.IS_MUSIC);
if(cursor!=null){
while(cursor.moveToNext()){
MusicList song=new MusicList();
song.filename=cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME));
song.name=cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME));
song.singer=cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
song.path=cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
song.duration=cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));
song.size=cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE));
if (song.size > 1000 * 800) {
if (song.name.contains("-")) {
String[] str = song.name.split("-");
song.singer = str[0];
song.name = str[1];
}
list.add(song);
}
}
cursor.close();//释放资源
3.显示音乐<界面> /* 此部分为非核心,非初学者请跳过 */
- 显示音乐当时选用ListView组件,listView组件需要一个item,代码核心如下:
- a)ListView组件
<ListView
android:id="@+id/mymusic"
android:layout_width="match_parent"
android:layout_height="wrap_content"></ListView>
- b)与ListView配套的Item /* 此部分为非核心,非初学者请跳过 */
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="horizontal">
<TextView
android:id="@+id/item_position"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="20dp"
android:text="1"
android:gravity="center"
android:textColor="#0d0c0c"
android:textSize="18sp" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginTop="10dp"
android:orientation="vertical">
<TextView
android:id="@+id/item_song"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="歌曲名"
android:textColor="#0d0c0c"
android:textSize="20dp" />
<LinearLayout
android:layout_width="360dp"
android:layout_height="wrap_content">
<TextView
android:id="@+id/item_singer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/item_song"
android:text="歌手"
android:textColor="#0d0c0c"
android:textSize="15sp" />
<TextView
android:id="@+id/item_duration"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="150dp"
android:text="时间"
android:textColor="#0d0c0c"
android:textSize="15sp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
4.listview绑定的Adapter类
public class MyAdapter extends BaseAdapter {
private Context context;
private List<MusicList> list;
public MyAdapter(MainActivity mainActivity,List<MusicList> list){
this.context=mainActivity;
this.list=list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
public static String formatTime(int time) {
if (time / 1000 % 60 < 10) {
return time / 1000 / 60 + ":0" + time / 1000 % 60;
} else {
return time / 1000 / 60 + ":" + time / 1000 % 60;
}
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ViewHolder holder=null;
if(view==null){
holder=new ViewHolder();
view=View.inflate(context,R.layout.music,null);
holder.song=(TextView)view.findViewById(R.id.item_song);
holder.singer=(TextView)view.findViewById(R.id.item_singer);
holder.duration=(TextView)view.findViewById(R.id.item_duration);
holder.position=(TextView)view.findViewById(R.id.item_position);
view.setTag(holder);
}else{
holder=(ViewHolder)view.getTag();
}
holder.song.setText(list.get(i).name.toString());
holder.singer.setText(list.get(i).singer.toString());
int duration=list.get(i).duration;
String time=formatTime(duration);
holder.duration.setText(time);
holder.position.setText(i+1+"");
return view;
}
class ViewHolder{
TextView song;
TextView singer;
TextView duration;
TextView position;
}
}
5.主类
- 主类实现整个app的功能,分别介绍:
- a)初始化一个ListView
private void initview(){
mylist=(ListView)findViewById(R.id.mymusic);
list=new ArrayList<>();
list=GetMusicList.getmusicdata(this);
adapter=new MyAdapter(this,list);
mylist.setAdapter(adapter);
}
- b)音乐相关——播放
play.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(!mediaPlayer.isPlaying())
mediaPlayer.start();
}
});
- c)音乐相关——暂停
pause.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mediaPlayer.isPlaying())
mediaPlayer.pause();
}
});
- d)音乐相关——停止
stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
try {
mediaPlayer.reset();
mediaPlayer.setDataSource(list.get(i).path);
mediaPlayer.prepare();
mediaPlayer.seekTo(0);
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
- e)音乐相关——上一首
pro.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(i==0){
i=list.size()-1;
}else{
i--;
}
mediaPlayer.stop();
try {
mediaPlayer.reset();
mediaPlayer.setDataSource(list.get(i).path);
mediaPlayer.prepare();
mediaPlayer.start();
} catch (Exception e) {
e.printStackTrace();
}
}
});
- f)音乐相关——下一首
next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(i==(list.size()-1)){
i=0;
}else{
i++;
}
mediaPlayer.stop();
try {
mediaPlayer.reset();
mediaPlayer.setDataSource(list.get(i).path);
mediaPlayer.prepare();
mediaPlayer.start();
} catch (Exception e) {
e.printStackTrace();
}
}
});
- g)不仅如此,主类的实现还包括,创建删除初始化MediaPlayer,授权失败处理等等,详情请看代码。
三、链接
代码Coding链接: 代码链接
APP下载地址: APP下载链接
由于上次链接APP在模拟器上安装闪退问题,,,该链接已更新!
inuyasha