package io.hefuyi.listener.dataloader;
import android.content.Context;
import android.database.Cursor;
import android.provider.MediaStore;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import io.hefuyi.listener.mvp.model.FolderInfo;
import rx.Observable;
import rx.Subscriber;
/**
* Created by hefuyi on 2016/12/11.
*/
public class FolderLoader {
/**
* 检索包含音频文件的文件夹, 并统计该文件夹下的歌曲数目
* @return
*/
public static Observable<List<FolderInfo>> getFoldersWithSong(final Context context) {
final List<FolderInfo> folderInfos = new ArrayList<FolderInfo>();
final String num_of_songs = "num_of_songs";
final String[] projection = new String[]{MediaStore.Files.FileColumns.DATA,
"count(" + MediaStore.Files.FileColumns.PARENT + ") as " + num_of_songs};
final String selection = " is_music=1 AND title != '' " + " ) " + " group by ( "
+ MediaStore.Files.FileColumns.PARENT;
return Observable.create(new Observable.OnSubscribe<List<FolderInfo>>() {
@Override
public void call(Subscriber<? super List<FolderInfo>> subscriber) {
Cursor cursor = context.getContentResolver().query(
MediaStore.Files.getContentUri("external"), projection, selection, null, null);
if (cursor != null) {
int index_data = cursor.getColumnIndex(MediaStore.Files.FileColumns.DATA);
int index_num_of_songs = cursor.getColumnIndex(num_of_songs);
while (cursor.moveToNext()) {
// 获取每个目录下的歌曲数量
int songCount = cursor.getInt(index_num_of_songs);
// 获取文件的路径,如/storage/sdcard0/MIUI/music/Baby.mp3
String filepath = cursor.getString(index_data);
// 获取文件所属文件夹的路径,如/storage/sdcard0/MIUI/music
String folderpath = filepath.substring(0, filepath.lastIndexOf(File.separator));
// 获取文件所属文件夹的名称,如music
String foldername = folderpath.substring(folderpath.lastIndexOf(File.separator) + 1);
folderInfos.add(new FolderInfo(foldername, folderpath, songCount));
}
}
if (cursor != null) {
cursor.close();
}
subscriber.onNext(folderInfos);
}
});
}
}