(三)读取本地音乐文件

2023-05-16

在进行简聆APP开发时,既然是一个音乐播放器,那么本地音乐的读取是一定要的

首先,我们需要注意的是,读取本地音乐是要获取android存储权限的,权限如下


<!-- 读取存储卡 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />  

当然,在遇到系统为6.0及以上的手机还需要动态获取权限,这里暂时推荐一篇博文

我也是采用了这篇博文的方法来获取6.0权限的

地址如下:

https://github.com/yanzhenjie/AndPermission

然后便是读取本地数据库来获取音乐文件的相关信息了

注意的是,我是在service的oncreatr方法里读取音乐的

这样子读取的好处是以后如果有多个页面需要展示音乐列表数据

比如本地音乐、网络音乐、我的收藏等

这些页面可以方便地统一从service中获取到数据

这里主要获取了本地音乐的歌曲名称、歌手、时长、地址等相关信息。

我做成了一个工具类的形式

代码如下:


/**
 * 音乐工具类,扫描系统里面的音频文件,返回一个list集合
 */
public class MusicUtils {
    public static List<Song> getMusicData(Context context) {
        List<Song> list = new ArrayList<Song>();
        //拼音首字母
        for (int i = 'A'; i <= 'Z'; i++) {
            Song songnum = new Song("" + (char) i, 0);
            list.add(songnum);
        }

        // 媒体库查询语句(写一个工具类MusicUtils        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()) {
                Song song = new Song(1);
                //歌曲
                song.song = 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.song.contains("-")) {
                        String[] str = song.song.split("-");
                        song.singer = str[0].trim();
                        song.song = str[1].trim();
                    }
                    //设置拼音首字母
                    song.setPys(ChineseToLetter.GetFirstPinyin(song.song));
                    list.add(song);
                }

            }

            // 释放资源
            cursor.close();
        }

        return list;
    }

    /**
     * 定义一个方法用来格式化获取到的时间
     */
    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;
        }
    }
}
  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(三)读取本地音乐文件 的相关文章

  • iOS,面试必看,最全梳理

    序言 目前形势 xff0c 参加到iOS队伍的人是越来越多 xff0c 甚至已经到供过于求了 今年 xff0c 找过工作人可能会更深刻地体会到今年的就业形势不容乐观 xff0c 加之 xff0c 培训机构一火车地向用人单位输送iOS开发人员
  • Android-自定义View集合

    学习安卓几个月了 xff0c 也有点自己的体会 xff0c 然而我发现自己真正喜欢的是数据方面的东西 xff0c 当然android自定义view也很好玩 xff0c 很体验一些技巧性的东西 也不想自己以前学习过程总结的东西就此淹没 xff
  • 新版本VSCode的eslint使用指导

    1 VSCode版本 xff1a 2 VSCode插件栏搜索 eslint 安装 xff1b 3 开启eslint xff1a 在首选项的用户设置里搜索formatOnSave 勾选 xff1b 4 安装eslint npm install
  • crontab、flock、timeout的配合使用实现定时任务超时及报警

    需求场景 开发后台的同学 xff0c 经常需要写一些脚本定时启动运行 xff0c 通常使用crontab来实现 有时候还有更加苛刻的需求 xff1a 脚本不仅需要定时启动 xff0c 而且还需要保证互斥 xff08 同一时间只有一个进程在跑
  • (原创)Flutter基础入门:手把手教你搭建Flutter混合项目:AAR方式集成

    前言 上一篇博客讲了如何用 模块代码依赖模式 这种方式去搭建Flutter混合项目 因为篇幅原因 xff0c AAR集成方式来搭建项目的步骤和注意点放到这篇博客来讲 如果你没看过上篇博客 xff0c 建议先阅读上一篇 xff1a xff08
  • Linux基础知识之systemd详解

    0x00 Systemd 简述 1 Linux 启动流程 2 主角登场 0x01 Systemd Unit 1 配置文件 2 启动流程 3 进程树 Process tree 4 运行级别 0x02 Systemd Manager 1 Sys
  • IntelliJ IDEA中有什么让你相见恨晚的好用插件?

    hello xff0c 大家好 xff0c 我是 Jackpop xff0c 硕士毕业于哈尔滨工业大学 xff0c 曾在华为 阿里等大厂工作 xff0c 如果你对升学 就业 技术提升等有疑惑 xff0c 不妨交个朋友 xff1a 我是Jac
  • Android串口的使用(转载+移植)

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言一 移植java文件二 移植jni文件总结 前言 最近需要在上层app使用串口 发送指令对底层硬件进行操作 xff0c 因此
  • webstorm 代码格式检测

  • Android NFC基础入门

    说道NFC 是Near Field Communication缩写 xff0c 就是近距离无线通讯技术 NFC采用主动和被动两种通信模式 工作的模式有三种 xff0c 读写标签 xff0c 点对点 xff0c 仿真卡模式 xff0c 今天我
  • 嵌入式系统实践 12 ——基于ARM汇编 Keil5 MSP432 P401R开发板

    物联网实验1 阿里云远程控制小灯 span class token comment span span class token comment span span class token comment MSP432P401 span sp
  • Linux下使用rpm包安装MySQL数据库

    root 64 Hadoop102 df h df 34 34 没有那个文件或目录 df 34 h 34 没有那个文件或目录 root 64 Hadoop102 df h 文件系统 容量 已用 可用 已用 挂载点 dev mapper ce
  • Linux下SSH登录的三种方式

    SSH登录 SSH密钥登录 xff1a SSH默认采用密码登录 xff0c 这种方法有很多缺点 xff0c 简单的密码不安全 xff0c 复杂的密码不容易记忆 xff0c 每次手动输入也很麻烦 密钥登录是更好的解决方案 接下来介绍三种SSH
  • 在失望中重找希望——我的2013年工作总结

    时间过的真的是快 来广州已整整工作了一年啦 从2012年长沙工作离职后 为了我的女朋友 我毅然踏上了南下广州的征途 来到羊城后 很快 xff0c 一个礼拜就找到了现在工作的这家公司 现在回想一下 真觉得当初没有好好斟酌一下 2013年里 x
  • ubuntu root开机自登录 与 ros 节点自启

    1 systemctl命令及开机自启 新建a sh文件 放入 cd etc vim a sh xff01 usr bin env bash bash c 34 source opt ros melodic setup bash amp am
  • (原创)详解Glide图片加载库常用方法

    前言 Glide作为安卓开发常用的图片加载库 xff0c 有许多实用而且强大的功能 xff0c 那么 xff0c 今天就来总结一番 xff0c 这次把比较常见的都写出来 xff0c 但并不是全部哦 在介绍之前 xff0c 先来说说什么是Gl
  • 如何将本地windows文件复制到远程windows服务器

    如何使用windows自带的远程桌面连接程序将文件复制到远程服务器内 运行中输入mstsc xff0c 点击确定 输入服务器的IP和端口 xff0c 点击右下角的选项 然后点击本地资源选项卡 点击详细信息按钮 此时勾选你所要连接到服务器上的
  • 强国的语言与语言强国

    强国的语言与语言强国 作者 xff1a 教育部语言文字信息管理司司长 教育部语言文字应用研究所所长 中国社会科学院研究生 李宇明 理论上语言是一律平等的 xff0c 现实中语言是有强有弱的 语言的强弱与语言所属社团的强弱盛衰呈正相关 古罗马
  • 前端post请求报400错误

    前端post请求报400错误 发布时间 xff1a 2019 06 05 18 28 54 400的错误是由于发送请求参数没有成功 原因 xff1a 参数名称类型没有对上 xff1b 或者参数格式不正确 参数格式不正确 xff0c 解决方法

随机推荐