Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 仅显示包含具有特定文件类型的文件的文件夹_Android - Fatal编程技术网

Android 仅显示包含具有特定文件类型的文件的文件夹

Android 仅显示包含具有特定文件类型的文件的文件夹,android,Android,我已经设置了显示SD卡上所有文件夹的代码,但现在我正试图找出如何只显示包含MP3文件的文件夹 如何筛选出不包含.MP3文件的文件夹?谢谢 类别: public class FragmentFolders extends ListFragment { private File file; private List<String> myList; public void onCreate(Bundle savedInstanceState) { super.onCreate(s

我已经设置了显示SD卡上所有文件夹的代码,但现在我正试图找出如何只显示包含MP3文件的文件夹

如何筛选出不包含.MP3文件的文件夹?谢谢

类别:

public class FragmentFolders extends ListFragment {
private File file;
private List<String> myList;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    myList = new ArrayList<String>();

    String root_sd = Environment.getExternalStorageDirectory().toString();
    file = new File(root_sd);

    File list[] = file.listFiles();

    for (int i = 0; i < list.length; i++) {
        myList.add(list[i].getName());
    }

    setListAdapter(new ArrayAdapter<String>(getActivity(),
            android.R.layout.simple_list_item_1, myList));

}

public void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);

    File temp_file = new File(file, myList.get(position));

    if (!temp_file.isFile()) {
        file = new File(file, myList.get(position));
        File list[] = file.listFiles();

        myList.clear();

        for (int i = 0; i < list.length; i++) {
            myList.add(list[i].getName());
        }
        Toast.makeText(getActivity(), file.toString(), Toast.LENGTH_LONG)
                .show();
        setListAdapter(new ArrayAdapter<String>(getActivity(),
                android.R.layout.simple_list_item_1, myList));

    }

    return;
}

}

您可以使用fileNameFilter并筛选出不需要的文件夹/文件

File baseDirectory = new File("/mnt/sdcard/"); //Your base dir here
File[] files = baseDirectory.listFiles(new FilenameFilter() {
    @Override
    public boolean accept(File dir, String fileName) {
    File possibleMp3Folder = new File(dir, fileName);
    if (possibleMp3Folder.isDirectory()) {
        File[] files1 = possibleMp3Folder.listFiles();
        for (File file : files1) {
            if (file.getName().toLowerCase().endsWith(".mp3")) {
                return true;
            }
        }
   }

   return false;
}
});

在添加到列表视图的数据集之前,可以检查目录中的文件是否为mp3文件

按如下方式修改您的代码:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

     myList = new ArrayList<String>();

        String root_sd = Environment.getExternalStorageDirectory().toString();
        file = new File(root_sd);

        //list content of root sd

        File list[] = file.listFiles();

        for (int i = 0; i < list.length; i++) {

                //check the contents of each folder before adding to list

                File  mFile = new File(file, list[i].getName());
                File dirList[] = mFile.listFiles();
                   if(dirList == null) continue;
                  for (int j = 0; j < dirList.length; j++) {
                    if(dirList[j].getName().toLowerCase(Locale.getDefault()).endsWith(".mp3")){
                    myList.add(list[i].getName());
                    break;
                    }
              }

        }

        setListAdapter(new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, myList));
}
仅列出音乐文件夹


此外,如果您正在查找所有文件夹,其中包含内部存储和SD卡上的mp3文件,并且可用存储包含介质,则可能需要使用asyncTask来避免占用UI线程:

初始化两组媒体存储路径和mp3文件夹路径:

在一个方法中同时获取这两个值如果只需要一个,则可以返回值:

private void getMediaFolders() {
    ContentResolver resolver = getContentResolver();

    Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0";
    String[] projection = { MediaStore.Audio.Media.DATA };

    Cursor cursor = resolver.query(uri, projection, selection, null, null);

    if(cursor != null && cursor.getCount() > 0) {
        int dataIndex = cursor.getColumnIndex(MediaStore.Audio.Media.DATA);

        while(cursor.moveToNext()) {
            String data = cursor.getString(dataIndex);

            int i = 0;
            for (int slashCount = 0; i < data.length(); i++) {
                if (data.charAt(i) == '/' && ++slashCount == 3) {
                    storageSet.add(data.substring(0, i));
                    break;
                }
            }

            if (data.toLowerCase().endsWith("mp3")) {
                int lastSlashIndex = data.lastIndexOf('/');
                while (i < lastSlashIndex) {
                    data = data.substring(0, lastSlashIndex);
                    folderSet.add(data);
                    lastSlashIndex = data.lastIndexOf('/');
                }
            }
        }
    }

    if (cursor != null) { cursor.close(); }
}
使用Annimonstream筛选文件夹:

private ArrayList<File> getFilteredFolders(@NonNull String path, HashSet<String> folderSet) {
    File[] filesList = new File(path).listFiles();

    if (filesList == null) { return new ArrayList<>(); } // Or handle error as you wish

    return Stream.of(filesList)
        .filter(File::isDirectory)
        .filter(f -> folderSet.contains(f.getAbsolutePath()))
        .collect(Collectors.toCollection(ArrayList::new));
}
如果需要,显示存储


这将提供特定文件夹中的mp4文件

如何处理子目录?
private void getMediaFolders() {
    ContentResolver resolver = getContentResolver();

    Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0";
    String[] projection = { MediaStore.Audio.Media.DATA };

    Cursor cursor = resolver.query(uri, projection, selection, null, null);

    if(cursor != null && cursor.getCount() > 0) {
        int dataIndex = cursor.getColumnIndex(MediaStore.Audio.Media.DATA);

        while(cursor.moveToNext()) {
            String data = cursor.getString(dataIndex);

            int i = 0;
            for (int slashCount = 0; i < data.length(); i++) {
                if (data.charAt(i) == '/' && ++slashCount == 3) {
                    storageSet.add(data.substring(0, i));
                    break;
                }
            }

            if (data.toLowerCase().endsWith("mp3")) {
                int lastSlashIndex = data.lastIndexOf('/');
                while (i < lastSlashIndex) {
                    data = data.substring(0, lastSlashIndex);
                    folderSet.add(data);
                    lastSlashIndex = data.lastIndexOf('/');
                }
            }
        }
    }

    if (cursor != null) { cursor.close(); }
}
private ArrayList<File> getFilteredFolders(@NonNull String path, HashSet<String> folderSet) {
    File[] filesList = new File(path).listFiles();

    if (filesList == null) { return new ArrayList<>(); } // Or handle error as you wish

    return Stream.of(filesList)
        .filter(File::isDirectory)
        .filter(f -> folderSet.contains(f.getAbsolutePath()))
        .collect(Collectors.toCollection(ArrayList::new));
}
               Uri,Projection,
                            MediaStore.Video.Media.DATA
                            + " like " + "'%.mp4%'"
                            + " AND "
                            + MediaStore.Video.Media.DATA
                            + " like " + "'%" + getResources().
                            getString(R.string.string_store_video_folder) 
                            +"%'", null,
                    MediaStore.Video.Media.DATE_MODIFIED