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在模拟器上安装闪退问题,,,该链接已更新!

posted @ 2018-12-11 13:01  砯冰  阅读(245)  评论(0编辑  收藏  举报