Android外部存储

Android外部存储,android,storage,external,Android,Storage,External,我正在使用方法Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY\u MUSIC)获取Android设备保存音乐的默认目录 此方法返回的目录存在(类似sdcard/music),但没有任何音乐文件。当我检查我的SD卡时,我发现所有的音乐文件都存储在由我的一个应用程序命名的另一个目录(SD卡/qqmusic/song)中,使用getExternalStoragePublicDirectory方法无法找到该目录 在这

我正在使用方法
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY\u MUSIC)
获取Android设备保存音乐的默认目录

此方法返回的目录存在(类似sdcard/music),但没有任何音乐文件。当我检查我的SD卡时,我发现所有的音乐文件都存储在由我的一个应用程序命名的另一个目录(SD卡/qqmusic/song)中,使用
getExternalStoragePublicDirectory
方法无法找到该目录


在这种情况下(不同的设备在不同的位置存储音乐),是否有任何好的方法来获取路径,而不考虑设备之间的差异?

正如我们在评论中所讨论的,我将展示Android音乐应用程序如何查找所有音乐文件

Android音乐应用程序只需查询MediaProvider即可获取外部存储(即SD卡)上的所有音乐

数据库中的数据由。MediaScannerService调用以搜索这些目录下的所有文件。若元数据是音频文件,则获取元数据并将其放入数据库(MediaProvider)

所以我的答案是MediaProvider已经在外部存储器中包含了音乐文件,因此您可以直接查询该提供商以获取所有音乐文件

先检查一下

您可以使用以下代码获取所有音乐文件

//Some audio may be explicitly marked as not being music
String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0";

String[] projection = {
        MediaStore.Audio.Media._ID,
        MediaStore.Audio.Media.ARTIST,
        MediaStore.Audio.Media.TITLE,
        MediaStore.Audio.Media.DATA,
        MediaStore.Audio.Media.DISPLAY_NAME,
        MediaStore.Audio.Media.DURATION
};

cursor = this.managedQuery(
        MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
        projection,
        selection,
        null,
        null);

private List<String> songs = new ArrayList<String>();
    while(cursor.moveToNext()){
        songs.add(cursor.getString(0) + "||" + cursor.getString(1) + "||" +   cursor.getString(2) + "||" +   cursor.getString(3) + "||" +  cursor.getString(4) + "||" +  cursor.getString(5));
}
//某些音频可能被明确标记为非音乐
字符串选择=MediaStore.Audio.Media.IS_MUSIC+“!=0”;
字符串[]投影={
MediaStore.Audio.Media.\u ID,
MediaStore.Audio.Media.ARTIST,
MediaStore.Audio.Media.TITLE,
MediaStore.Audio.Media.DATA,
MediaStore.Audio.Media.DISPLAY\u名称,
MediaStore.Audio.Media.DURATION
};
cursor=this.managedQuery(
MediaStore.Audio.Media.EXTERNAL\u CONTENT\u URI,
投影,
选择,
无效的
无效);
私有列表歌曲=新建ArrayList();
while(cursor.moveToNext()){
歌曲.add(cursor.getString(0)+“| |”+cursor.getString(1)+“| |”+cursor.getString(2)+“| |”+cursor.getString(3)+“| |”+cursor.getString(4)+“| |”+cursor.getString(5));
}

MediaStore.Audio.Media.DATA
列包含该音乐文件的完整路径

让用户告诉你这些音乐文件在哪里是明智的。我认为大多数用户不会关心他们的设备将音乐文件保存在哪里。但显然,音乐是由qqmusic下载的,qqmusic是中国流行的应用程序。该目录是由该应用程序创建的。当我打开原始android音乐播放器时,它可以显示我手机中的所有歌曲,而无需询问我正在使用哪个应用程序……我想知道是否有一个过滤器或什么东西可以过滤掉所有音乐。是的,原始android音乐搜索SD卡下的所有目录。如果你愿意,我可以发布源代码。我可以理解光标部分,但MediaProvider部分让我困惑。你能详细解释一下吗?外部卷一般指SD卡,扫描(…)方法调用MediaScanner中的ScandDirectory方法,我已经发布了MediaScanner的源代码,你可以看一下@艾伦
//Some audio may be explicitly marked as not being music
String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0";

String[] projection = {
        MediaStore.Audio.Media._ID,
        MediaStore.Audio.Media.ARTIST,
        MediaStore.Audio.Media.TITLE,
        MediaStore.Audio.Media.DATA,
        MediaStore.Audio.Media.DISPLAY_NAME,
        MediaStore.Audio.Media.DURATION
};

cursor = this.managedQuery(
        MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
        projection,
        selection,
        null,
        null);

private List<String> songs = new ArrayList<String>();
    while(cursor.moveToNext()){
        songs.add(cursor.getString(0) + "||" + cursor.getString(1) + "||" +   cursor.getString(2) + "||" +   cursor.getString(3) + "||" +  cursor.getString(4) + "||" +  cursor.getString(5));
}