zoukankan      html  css  js  c++  java
  • 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在模拟器上安装闪退问题,,,该链接已更新!

  • 相关阅读:
    找到一款不错的网站压力测试工具webbench
    nginx的Mainline version、Stable version、Legacy version的版本区别
    信号值大于-75dBm时
    爱快AP-H1使用方法及排错
    Windows 2008 Server搭建Radius服务器的方法
    碰到故障大全---cd
    win10系统中UserManager 总是被禁用怎么解决?
    win7共享文件夹设置无密码
    时钟.html
    微信开发者文档
  • 原文地址:https://www.cnblogs.com/inuyasha1314/p/10101536.html
Copyright © 2011-2022 走看看