最近想写一个音乐的小APP出来(doge),借此熟悉音频开发的相关技术。但是在获取内部存储的音乐文件时踩了一些坑...所以有了这篇帖子,简单介绍下Android的存储类别,以及如何获取内部存储中的音乐文件。
首先要理解一个概念,内存≠内部存储。
内存 -> 程序运行是内存中进行的,并不是用于存储数据的。
百度百科描述如下:它用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。它是外存与CPU进行沟通的桥梁,计算机中所有程序的运行都在内存中进行,内存性能的强弱影响计算机整体发挥的水平。
二、内部存储是啥?
内部存储(InternalFileStorage)-> 内部存储是应用内部独有的存储,这部分存储的文件、数据,只能被应用自身访问到,其他应用都没有权限访问。
举个栗子,我下载了网易云音乐,网易云在手机存储中创建了个叫Cloudmusic的文件夹,网易云音乐的相关数据都在此文件夹下,其他应用都没得权限访问,仅仅自己进行访问。
(其实说到这里,我总能想起四大组件里面的Content Provider,懂我意思吧?使用内容提供者查询、访问其他应用程序的数据)
三、外部存储是啥?
外部存储(ExternalStorage)-> 在Android4.4以下系统,外部存储=插入手机内的SD卡(那个时候好像我还在玩天天酷跑??);在Android4.4系统及以上系统中,外部存储 = SD卡+机身存储中的外部存储。如下两图所示:
四、如何实现Android获取本地的音乐文件,以及我踩的坑。
Android 获取本地的音乐文件可以通过MediaStore的方式查询数据库得到歌曲信息。
相信大家对Android SQLite 都有所了解,我这就不过多赘述了。
Cursor cursor = null;
try {
cursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
null, null, null, null);
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
musicInfo = new MusicInfo();
//中间muicInfo是我创建的音乐文件的Bean类,
name = cursor.getString(cursor
.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME));
musicInfo.setName(name);
time = cursor.getString(cursor
.getColumnIndex(MediaStore.Audio.Media.DURATION));
musicInfo.setTime(time);
position = cursor.getPosition();
musicInfo.setPosition(String.valueOf(position));
musicInfo.setPath((UtilsFileName.getMusicFilePath(name)));
mDatas.add(musicInfo);
///storage/emulated/0/9.mp3 - >
}
adapter.setList(mDatas); //设置新的数据源
} catch (Exception e) {
e.printStackTrace();
} finally {
if (cursor != null) {
cursor.close();
}
}
//MediaStore.Audio.Media.EXTERNAL_CONTENT_URI 即获取内部存储中的音乐文件,如果有外部存储或者其他需求的可以更换调用的存储位置
仅是个人的一些分析和经验,希望能对有同样问题的朋友提供些许灵感,欢迎同好交流指正。文章来源:https://www.toymoban.com/news/detail-481690.html
本文回头我传到公众号上(二两仙气儿),欢迎小白一起交流学习。文章来源地址https://www.toymoban.com/news/detail-481690.html
到了这里,关于Android 获取内部存储中音乐文件的正确姿势的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!