如何获取图库文件夹路径?

时间:2018-07-22 12:48:38

标签: android

我正在尝试使用此功能删除图像。此功能删除最后修改(或最近修改)的图像。

public void deleteImage() {

        File f = new File(getGalleryPath());

        File [] files = f.listFiles();

        Arrays.sort(files, new Comparator<File>() {
            @Override
            public int compare(File a, File b) {
                if (a.lastModified() < b.lastModified())
                    return 1;
                if (a.lastModified() > b.lastModified())
                    return -1;
                return 0;
            }
        });

        files[0].delete();
    }

我想获取图库的路径,并尝试了此功能:

private static String getGalleryPath() {
        return  Environment.getExternalStorageDirectory() + "/" + Environment.DIRECTORY_DCIM + "/";
    }

当图库位于SD卡中时,此功能无法获取相应的图库路径。无论画廊的位置在哪里,如何获取此处的路径?

更新

我可以删除图像,但是在使用棒棒糖的设备中,图像仍然存在。但是,图像变灰,其大小为0 kb。这是我正在使用的代码:

public File getAlbumStorageDir(String albumName) {
// Get the directory for the user's public pictures directory.
File file = new File(Environment.getExternalStoragePublicDirectory(
        Environment.DIRECTORY_PICTURES), albumName);
if (!file.mkdirs()) {
    Log.e(LOG_TAG, "Directory not created");
}
return file;

我已经使用API​​> = 24在两部小米手机中测试了此代码。但是,当我在LG G3 Beat(API 21)中对其进行测试时,图像仍然存在,但显示为灰色。如果有人知道这里的修复方法,请告诉我。

2 个答案:

答案 0 :(得分:1)

在较新版本的Android中,与外部存储上的媒体文件进行交互的首选方法是通过MediaStore。这样做的想法是抽象出使用直接路径访问文件的必要性,而是通过对文件进行索引的内容提供程序(如MediaStore)按文件的类型和ID引用它们。由于对Android上文件访问的安全性进行了更改,因此使用您提到的方法也变得越来越复杂。

要获取最新修改的文​​件,您将需要使用类似的

//Type of Data to return for each image
String[] retColumns = { MediaStore.Images.Media.DATE_MODIFIED,
                        MediaStore.Images.Media.SIZE,
                        MediaStore.Images.Media._ID,
                        MediaStore.Images.Media.TITLE,
                        MediaStore.Images.Media.BUCKET_DISPLAY_NAME,
                        MediaStore.Images.Media.BUCKET_ID};

//How to order the results
String orderBy = MediaStore.Images.Media.DATE_MODIFIED;

Cursor imageCursor;

//Only return files where the selection is equal to the selectionArgs
String selection = MediaStore.Images.Media.RELATIVE_PATH + "=?";
String[] selectionArgs = {"Relative Path of Folder like DCIM/Instagram"};
//You can get this from an image you already know the ID of 
//by accessing the MediaStore.Images.Media.RELATIVE_PATH column

imageCursor = ctx.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, retColumns, selection, selectionArgs, orderBy);
imageCursor.moveToPosition(imageCursor.getCount() - 1)

由于我们返回的数据是按修改日期排序的,因此最后一个文件应该是最后修改的文件。例如,您可以使用关联的光标命令从文件中读取数据字段(注意:仅上述retColumns中返回的列)

Long dateModified = imageCursor.getLong(imageCursor.getColumnIndex(MediaStore.Images.Media.DATE_MODIFIED));

int imageID = imageCursor.getInt(imageCursor.getColumnIndex(MediaStore.Images.Media._ID));

然后您可以使用以下内容删除该文件

ctx.getContentResolver().delete(Uri.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, imageID), null, null);

在小于29的版本上,WRITE_EXTERNAL_STORAGE权限就足够了。在版本29+上,这将引发RecoverableSecurityException,由于不再保证这些类型的权限,因此需要在运行时捕获并处理。

答案 1 :(得分:0)

public File getAlbumStorageDir(String albumName) {
// Get the directory for the user's public pictures directory.
File file = new File(Environment.getExternalStoragePublicDirectory(
        Environment.DIRECTORY_PICTURES), albumName);
if (!file.mkdirs()) {
    Log.e(LOG_TAG, "Directory not created");
}
return file;