Android - 快速获取隐藏图像和文件夹的方法

pro*_*m85 9 android mediastore android-contentresolver

对于一个设备上得到所有图片我查询ContentResolverMediaStore.Images.现在我想添加一个选项来显示隐藏文件,以及像QuickPic这样的许多图像应用程序.

有没有比递归搜索手机上的所有目录更快的方法,并检查是否有.nomedia文件,如果是,请检查我是否可以在其中找到一些图像文件?

通过它是不可能的ContentResolver吗?

Hit*_*ahu 12

我正在添加另一个答案

  1. 快速闪电: - 在我的测试应用中以134微秒的速度执行扫描.
  2. 使用ContentResolver: - 用于ContentResolver扫描包含.noMedia文件的所有隐藏文件夹,然后检查该文件夹是否包含任何Image文件.您可以轻松修改代码以返回隐藏图像文件列表.

我做了一个虚拟应用程序来测试我的代码,这里输出

你可以看到测试应用程序显示WhatsApp的Sent Images文件夹有隐藏的图像,但同时Video文件夹没有(根据要求).

whatsApp中的隐藏图像

这该怎么做

问题可以分为几个部分

1)首先借助于content resolver获取所有目录中的.noMedia文件.下面的代码片段是自解释的

private static final String FILE_TYPE_NO_MEDIA = ".nomedia";


/**
     * This function return list of hidden media files
     * 
     * @param context
     * @return list of hidden media files
     */
    private ArrayList<CustomFile> filterFiles(Context context) {

        ArrayList<CustomFile> listOfHiddenFiles = new ArrayList<CustomFile>();
        String hiddenFilePath;

        // Scan all no Media files
        String nonMediaCondition = MediaStore.Files.FileColumns.MEDIA_TYPE
                + "=" + MediaStore.Files.FileColumns.MEDIA_TYPE_NONE;

        // Files with name contain .nomedia
        String where = nonMediaCondition + " AND "
                + MediaStore.Files.FileColumns.TITLE + " LIKE ?";

        String[] params = new String[] { "%" + FILE_TYPE_NO_MEDIA + "%" };

        // make query for non media files with file title contain ".nomedia" as
        // text on External Media URI
        Cursor cursor = context.getContentResolver().query(
                MediaStore.Files.getContentUri("external"),
                new String[] { MediaStore.Files.FileColumns.DATA }, where,
                params, null);

        // No Hidden file found
        if (cursor.getCount() == 0) {

            listOfHiddenFiles.add(new CustomFile("No Hidden File Found",
                    "Nothing to show Here", "Nothing to show Here", false));

            // show Nothing Found
            return listOfHiddenFiles;
        }

        // Add Hidden file name, path and directory in file object
        while (cursor.moveToNext()) {
            hiddenFilePath = cursor.getString(cursor
                    .getColumnIndex(MediaStore.Files.FileColumns.DATA));
            if (hiddenFilePath != null) {

                listOfHiddenFiles
                        .add(new CustomFile(FileUtils
                                .getFileName(hiddenFilePath), hiddenFilePath,
                                FileUtils.getFileParent(hiddenFilePath),
                                isDirHaveImages(FileUtils
                                        .getFileParent(hiddenFilePath))));
            }
        }

        cursor.close();

        return listOfHiddenFiles;

    }
Run Code Online (Sandbox Code Playgroud)

2)现在为拼图的第二部分如何查找包含.noMedia文件的目录是否包含隐藏图像.

解决方法是使用简单的for循环检查目录中的任何文件是否有图像文件扩展名(.jpg,.png等),如果是真的打破循环并设置标志,当前目录中有一些隐藏的图像.

在这里,for loop您可以使用我第一个答案中的函数返回图像列表,而不是打破.**

/**
     * 
     * @param dir
     *            to serch in
     * @param fileType
     *            //pass fileType as a music , video, etc.
     * @return ArrayList of files of comes under fileType cataegory
     */
    public boolean isDirHaveImages(String hiddenDirectoryPath) {

        File listFile[] = new File(hiddenDirectoryPath).listFiles();

        boolean dirHaveImages = false;

        if (listFile != null && listFile.length > 0) {
            for (int i = 0; i < listFile.length; i++) {

                if (listFile[i].getName().endsWith(".png")
                        || listFile[i].getName().endsWith(".jpg")
                        || listFile[i].getName().endsWith(".jpeg")
                        || listFile[i].getName().endsWith(".gif")) {

                    // Break even if folder have a single image file
                    dirHaveImages = true;
                    break;

                }
            }
        }
        return dirHaveImages;

    }
Run Code Online (Sandbox Code Playgroud)

现在回到你的问题

  • 有没有比递归搜索
    手机上的所有目录并检查.nomedia文件是否在其中更快的方法?

    请参阅代码段1

    -

若然,检查一下我是否可以找到一些图像文件?

请参阅代码段2

  • 通过它是不可能的ContentResolver吗?

是的 !!

我已经在Github上完成了整个示例,您可以根据需要下载和修改

  • 是的,它不起作用。无法从 .nomedia 文件所在的隐藏文件夹中找到图像。 (2认同)