本文出自:http://blog.csdn.net/dt235201314/article/details/51341078

一丶本地音乐加载相当于就是listVIew应用

扣丁音乐1.0前部分(gif图大小限制)演示:

实体类Mp3Info(歌曲相关数据及get和set方法)

public class Mp3Info {private long id;
    private String title;//歌名
    private String artist;//艺术家
    private String album;//专辑
    private long albumId;
    private long duration;//时长
    private long size;//大小
    private String url;//路径
    private int isMusic;//是否为音乐
    public long getId() {return id;
    }public void setId(long id) {this.id = id;
    }public String getTitle() {return title;
    }public void setTitle(String title) {this.title = title;
    }public String getArtist() {return artist;
    }public void setArtist(String artist) {this.artist = artist;
    }public String getAlbum() {return album;
    }public void setAlbum(String album) {this.album = album;
    }public long getAlbumId() {return albumId;
    }public void setAlbumId(long albumId) {this.albumId = albumId;
    }public long getDuration() {return duration;
    }public void setDuration(long duration) {this.duration = duration;
    }public long getSize() {return size;
    }public void setSize(long size) {this.size = size;
    }public String getUrl() {return url;
    }public void setUrl(String url) {this.url = url;
    }public int getIsMusic() {return isMusic;
    }public void setIsMusic(int isMusic) {this.isMusic = isMusic;
    }@Override
    public String toString() {return "Mp3Info{" +"id=" + id +", title='" + title + '\'' +", artist='" + artist + '\'' +", album='" + album + '\'' +", albumId=" + albumId +", duration=" + duration +", size=" + size +", url='" + url + '\'' +", isMusic=" + isMusic +'}';
    }
}

工具类MediaUtils(实现例如筛选歌曲长度,时间格式化,图片处理等)

public class MediaUtils {//获取专辑封面的Uri
    private static final Uri albumArtUri = Uri.parse("content://media/external/audio/albumart");

    /**
     * 获取默认专辑图片
     */
    public static Bitmap getDefaultArtwork(Context context,boolean small){BitmapFactory.Options opts = new BitmapFactory.Options();
        opts.inPreferredConfig = Bitmap.Config.RGB_565;
        if(small){return BitmapFactory.decodeStream(context.getResources().openRawResource( + R.drawable.music_play),null,opts);
        }return BitmapFactory.decodeStream(context.getResources().openRawResource( + R.drawable.music_play),null,opts);
    }/**
     * 从文件当中获取专辑封面位图
     */
    private static Bitmap getArtworkFromFile(Context context,long songid,long albumid){Bitmap bm = null;
        if(albumid<0 && songid<0){throw new IllegalArgumentException("Must specify an album or a song id");
        }try {BitmapFactory.Options options = new BitmapFactory.Options();
            FileDescriptor fd = null;
            if(albumid<0){Uri uri = Uri.parse("content://media/external/audio/media"
                        +songid+"albumart");
                ParcelFileDescriptor pfd = context.getContentResolver().openFileDescriptor(uri,"r");
                if(pfd!=null){fd = pfd.getFileDescriptor();
                }}else{Uri uri = ContentUris.withAppendedId(albumArtUri,albumid);
                ParcelFileDescriptor pfd = context.getContentResolver().openFileDescriptor(uri, "r");
                if(pfd!=null){fd = pfd.getFileDescriptor();
                }}options.inSampleSize=1;
            //只进行大小判断
            options.inJustDecodeBounds = true;
            //调用此方法得到options得到图片大小
            BitmapFactory.decodeFileDescriptor(fd,null,options);
            //我们的目标是在800pixel的画面上显示
            //所以需要调用computeSampleSize得到图片缩放的比例
            options.inSampleSize = 100;
            //我们得到了缩放的比例,现在开始正式读入Bitmap数据
            options.inJustDecodeBounds = false;
            options.inDither = false;
            options.inPreferredConfig = Bitmap.Config.ARGB_8888;

            //根据options参数,减少所需要的内存
            bm = BitmapFactory.decodeFileDescriptor(fd,null,options);
        }catch (FileNotFoundException e){e.printStackTrace();
        }return bm;
    }/**
     * 获取专辑封面位图对象
     */
    public static Bitmap getArtwork(Context context,long song_id,long album_id,boolean allowdefault,boolean small){if(album_id<0){if(song_id<0){Bitmap bm = getArtworkFromFile(context,song_id,-1);
                if(bm!=null){return bm;
                }}if(allowdefault){return getDefaultArtwork(context,small);
            }return null;
        }ContentResolver res = context.getContentResolver();
        Uri uri = ContentUris.withAppendedId(albumArtUri,album_id);
        if(uri !=null){InputStream in = null;
            try {in = res.openInputStream(uri);
                BitmapFactory.Options options = new BitmapFactory.Options();
                //先指定原始大小
                options.inSampleSize = 1;
                //只进行大小判断
                options.inJustDecodeBounds = true;
                //调用此方法得到options得到图片的大小
                BitmapFactory.decodeStream(in,null,options);
                //我们的目标是在你N pixel的画面上显示。所以需要调用computeSampleSize得到图片缩放的比例
                //这里的target为800是根据默认专辑图片代傲决定的,800只是测试数字但是试验后发现完美的结合
                if(small){options.inSampleSize = computeSampleSize(options,40);
                }else {options.inSampleSize = computeSampleSize(options,600);
                }//我们得到了缩放比例,现在开始正式读入Bitmap数据
                options.inJustDecodeBounds = false;
                options.inDither = false;
                options.inPreferredConfig = Bitmap.Config.ARGB_8888;
                in = res.openInputStream(uri);
                return BitmapFactory.decodeStream(in,null,options);
            }catch (FileNotFoundException e){Bitmap bm = getArtworkFromFile(context,song_id,album_id);
                if(bm!=null){if(bm.getConfig()==null){bm = bm.copy(Bitmap.Config.RGB_565,false);
                        if(bm == null && allowdefault){return getDefaultArtwork(context,small);
                        }}else if(allowdefault){bm = getDefaultArtwork(context,small);
                    }return bm;
                }}finally {try {if(in != null){in.close();
                    }}catch (IOException e){e.printStackTrace();
                }}}return null;
    }/**
     * 对图片进行合适的缩放
     */
    public static int computeSampleSize(BitmapFactory.Options options,int target){int w = options.outWidth;
        int h = options.outHeight;
        int candidateW = w / target;
        int candidateH = h / target;
        int candidate = Math.max(candidateW,candidateH);
        if(candidate == 0){return 1;
        }if (candidate>1){if((w>target)&&(w/candidate)<target){candidate -= -1;
            }}if(candidate>1){if((h>target)&&(h/candidate)<target){candidate -= -1;
            }}return candidate;
    }/**
     * 用于从数据库中查询歌曲的信息,保存在List当中
     */
    public static ArrayList<Mp3Info> getMp3Infos(Context context){Cursor cursor = context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null,
                //最小音乐长度
                MediaStore.Audio.Media.DURATION + ">=180000", null,
                MediaStore.Audio.Media.DEFAULT_SORT_ORDER);

        ArrayList<Mp3Info> mp3Infos = new ArrayList<Mp3Info>();
        for(int i=0;i<cursor.getCount();i++){cursor.moveToNext();
            Mp3Info mp3Info = new Mp3Info();
            long id = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media._ID));//id
            String title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));//歌名
            String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));//艺术家
            String album = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM));//专辑
            long albumId = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));//专辑id
            long duration = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION));//时长
            long size = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.SIZE));//大小
            String url = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));//路径
            int isMusic = cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media.IS_MUSIC));//是否为音乐

            if(isMusic!=0){mp3Info.setId(id);
                mp3Info.setTitle(title);
                mp3Info.setArtist(artist);
                mp3Info.setAlbum(album);
                mp3Info.setAlbumId(albumId);
                mp3Info.setDuration(duration);
                mp3Info.setSize(size);
                mp3Info.setUrl(url);
                mp3Infos.add(mp3Info);
            }}cursor.close();
        return mp3Infos;
    }/**
     * 格式化时间,将毫秒转换为分:秒格式
     */
    public static String formatTime(long time){String min = time / (1000 * 60)+"";
        String sec = time % (1000 * 60)+"";
        if(min.length()<2){min = "0"+time / (1000 * 60)+"";
        }else{min = time / (1000 * 60)+"";
        }if(sec.length()==4){sec = "0"+(time % (1000 * 60))+"";
        }else if(sec.length()==3){sec = "00"+(time % (1000 * 60))+"";
        }else if(sec.length()==2){sec = "000"+(time % (1000 * 60))+"";
        }else if(sec.length()==1){sec = "0000"+(time % (1000 * 60))+"";
        }return min + ":" +sec.trim().substring(0,2);
    }}

activity_local_songs.xml(后面贴出)

item_music_fragment.xml(略)

很明显这里我和视频显示得不一样,歌曲图片不好找显示出来也不是很美观,于是我显示的是歌名,歌手,专辑,时间这个xml应个人喜好可调整

LocalSongsListAdapter.java

public class LocalSongsListAdapter extends BaseAdapter{private Context context;
    private ArrayList<Mp3Info> mp3Infos;

    public LocalSongsListAdapter(Context context,ArrayList<Mp3Info> mp3Infos){this.context = context;
        this.mp3Infos = mp3Infos;
    }public void setMp3Infos(ArrayList<Mp3Info> mp3Infos){this.mp3Infos = mp3Infos;
    }@Override
    public int getCount() {return mp3Infos.size();
    }@Override
    public Object getItem(int position) {return mp3Infos.get(position);
    }@Override
    public long getItemId(int position) {return position;
    }@Override
    public View getView(int position, View convertView, ViewGroup parent) {ViewHolder vh;
        if(convertView==null){convertView = LayoutInflater.from(context).inflate(R.layout.item_music_list,null);
            vh = new ViewHolder();
            vh.tv_song_name = (TextView)convertView.findViewById(R.id.tv_song_name);
            vh.tv_song_artist = (TextView)convertView.findViewById(R.id.tv_song_artist);
            vh.tv_song_album = (TextView)convertView.findViewById(R.id.tv_song_album);
            vh.tv_song_duration = (TextView)convertView.findViewById(R.id.tv_song_duration);
            convertView.setTag(vh);
        }else{vh = (ViewHolder)convertView.getTag();
        }//给控件赋值要写在if语句外面,否则第一次加载数据失败
        Mp3Info mp3Info = mp3Infos.get(position);
        vh.tv_song_name.setText(mp3Info.getTitle());
        vh.tv_song_artist.setText(mp3Info.getArtist());
        vh.tv_song_album.setText(mp3Info.getAlbum());
        vh.tv_song_duration.setText(MediaUtils.formatTime(mp3Info.getDuration()));

        return convertView;
    }static class ViewHolder{TextView tv_song_name;
        TextView tv_song_artist;
        TextView tv_song_album;
        TextView tv_song_duration;
    }
}

LocalSongsActivity.java

写到这里LocalSongsActivity.java里面只需要初始化控件,后面再贴出

/**
 * 初始化本地音乐列表
 */
private void initDate() {mp3Infos = MediaUtils.getMp3Infos(this);
    System.out.println(mp3Infos.size());
    localSongsListAdapter = new LocalSongsListAdapter(this,mp3Infos);
    localSongsListAdapter.notifyDataSetChanged();
    lv_local_songs_list.setAdapter(localSongsListAdapter);

}

SD卡读取权限,网络权限

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>

到这里就能完成歌曲的加载了

扣丁音乐(四)——本地音乐加载相关推荐

  1. 【Flutter】Image 组件 ( 配置本地 gif 图片资源 | 本地资源加载 placeholder )

    文章目录 一.配置本地 gif 图片资源 二.本地资源加载 Placeholder 三.完整代码示例 四.相关资源 一.配置本地 gif 图片资源 配置 assets 图片资源 : 将 gif 图片拷 ...

  2. [Cocos Creator] 本地文件加载系列六:本地龙骨动画dragonbones加载(web模式)

    [Cocos Creator] 本地文件加载系列一:本地文件读取(web模式) [Cocos Creator] 本地文件加载系列二:本地音频文件播放(web模式) [Cocos Creator] 本地 ...

  3. SAP Spartacus 4.0 源代码模式下开启 SSR,为什么会从本地去加载 all.css?

    为什么会从本地去加载 all.css 文件呢?这路径不对头: CSR 模式下,css 的加载是好的: 在 icon-loader.service.ts 代码里设置断点: 更多Jerry的原创文章,尽在 ...

  4. unity下载模型到本地并加载

    目录 1.目的 2.参考 2.1 Unity3D 动态加载本地/网络GLB模型 2.2 unity下载模型到本地并加载 2.3 插件:TriLib2.0 3.注意 4.操作 4.1 3dmax简单的制 ...

  5. 第四回-MBR加载与执行实验

    本回我们进行一次实验性的实操环节,机器上电运行相应BIOS代码,然后BIOS加载硬盘的MBR分区内容,并执行MBR代码.本次实验使用Bochs虚拟机模拟整个x86架构的真实机器.实验过程中我们需要为B ...

  6. 网易云音乐(2)————加载失败的原因

    昨天在听音乐的时候,网易音乐突然出了个问题,加载失败.而且是任何的歌曲都加载失败,也不能下载.在听歌的时候遇到这个问题真是蛋疼不已.一下子也不知道什么原因,就上网百度了一下,给出了一下几种方案. 1. ...

  7. python 播放本地音乐_python本地音乐播放器

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 这两天搜了下tkinter图形界面的帖子,做了个简单的播放器界面,听首<盗 ...

  8. android webview 加载本地,webview加载本地资源的各种尝试

    1.webview 打开sd卡上的静态html文件 ,js文件既然放在assets文件夹下能找到,那能通过放在sd卡,能加载吗? 答:事实证明,是没有用的. 2.既然能拿到html的数据,那我们是不是 ...

  9. Unity 工具类 之 WWW/UnityWebRequest 下载压缩文件(zip),解压到本地且加载使用解压数据的简单案例(内也含压缩文件例子)

    Unity 工具类 之 WWW/UnityWebRequest 网络下载压缩文件(zip),解压到本地,且加载使用解压数据的简单案例(内也含压缩文件例子) 目录 Unity 工具类 之 WWW/Uni ...

  10. Android 自定义本地图片加载库,仿微信相册

    总结一下微信的本地图片加载有以下几个特点,也是提高用户体验的关键点 1.缩略图挨个加载,一个一个加载完毕,直到屏幕所有缩略图都加载完成 2.不等当前屏的所有缩略图加载完,迅速向下滑,滑动停止时立即加载 ...

最新文章

  1. 【小样本学习】什么是小样本学习?这篇综述文章用166篇参考文献告诉你答案...
  2. 定时清理日志文件-python实现
  3. Android-DataBinding源码探究
  4. 【转】单元测试基础知识
  5. 20-21-2网络管理quiz4
  6. 内网html预览word,C# 实现Office在线预览
  7. 【CQF Finance Class 3 债券】
  8. c 实现走迷宫流程图_C语言走迷宫游戏流程图和代码框架
  9. 安卓系统手机如何用作电脑摄像头使用及解决方法
  10. Python图片处理模块Pillow
  11. 使用matplotlib修改字体之Times New Roman
  12. Photoshop教程_ps中怎么载入图案?PS图案如何导入?
  13. Linux中ibus输入法中全拼和双拼的问题+解决VNCserver切换不成功问题
  14. 树莓派摄像头检测运动物体
  15. php浮点转int少1,PHP中浮点数计算比较及取整不准确的解决方法
  16. 2016年保密技术交流大会的璀璨之星—亿赛通
  17. 钓鱼网站套路深,上网须谨慎
  18. pyqt5 地图可视化 网页地图 folium
  19. 无线射频模组生产测试的流程
  20. js 格式化 java时间格式化_JavaScript前台页面使用jsjava对后台传过来的日期进行格式化...

热门文章

  1. docker安装redis(详细步骤)
  2. ijkplayer系列14:从入门到进阶问题树梳理
  3. 【题解】P1553 数字反转(升级版)
  4. 好压软件测试大乐,速度惊艳!2345好压又一次性能提升
  5. 2分钟带您了解熟悉冲压模具
  6. 一名出色的设计师需要具备哪些能力和要求?
  7. 给企业管理者的忠告《原则》作者瑞·达利欧
  8. rosdep安装与使用
  9. [MRCTF2020]古典密码知多少
  10. 古典密码算法实验c语言,古典密码实验报告.doc