java - 在 Android Q 之前可以获取带有相册的图像,但在 Android Q 上则不行

标签 java android mediastore android-10.0

我在 Stack Overflow 上尝试了其他解决方案,但它们无法解决我的问题。以下代码在 Android Q 版本之前可以完美运行,但不适用于 Android Q。

以下是用于获取相册和图像的函数。

首先获取AlbumImages:

 public static ArrayList<ImageFolder> getPicturePaths(Context context){
    ArrayList<ImageFolder> picFolders = new ArrayList<>();
    ArrayList<String> picPaths = new ArrayList<>();
    Uri allImagesuri = android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
        String[] projection = {MediaStore.Images.ImageColumns.DATA, MediaStore.Images.Media.DISPLAY_NAME,
                MediaStore.Images.Media.BUCKET_DISPLAY_NAME, MediaStore.Images.Media.BUCKET_ID};
        Cursor cursor = context.getContentResolver().query(allImagesuri, projection, null, null, null);
        try {
            if (cursor != null) {
                cursor.moveToFirst();
            }
            do {
                ImageFolder folds = new ImageFolder();
                String name = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME));
                String folder = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.BUCKET_DISPLAY_NAME));
                String datapath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));

                //String folderpaths =  datapath.replace(name,"");
                String folderpaths = datapath.substring(0, datapath.lastIndexOf(folder + "/"));
                folderpaths = folderpaths + folder + "/";
                if (!picPaths.contains(folderpaths)) {
                    picPaths.add(folderpaths);

                    folds.setPath(folderpaths);
                    folds.setFolderName(folder);
                    folds.setFirstPic(datapath);//if the folder has only one picture this line helps to set it as first so as to avoid blank image in itemview
                    folds.addpics();
                    picFolders.add(folds);
                } else {
                    for (int i = 0; i < picFolders.size(); i++) {
                        if (picFolders.get(i).getPath().equals(folderpaths)) {
                            picFolders.get(i).setFirstPic(datapath);
                            picFolders.get(i).addpics();
                        }
                    }
                }
            } while (cursor.moveToNext());
            cursor.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    return picFolders;
}

这是从相册中获取图像的方法:

    public static ArrayList<PhotoItemModel> getAllImagesByFolder(Context context, String path){
   ArrayList<PhotoItemModel> images = new ArrayList<>();
    Uri allImagesuri = android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
        String[] projection = { MediaStore.Images.ImageColumns.DATA ,MediaStore.Images.Media.DISPLAY_NAME,
                MediaStore.Images.Media.SIZE};
        Cursor cursor = context.getContentResolver().query( allImagesuri, projection, MediaStore.Images.Media.DATA + " like ? ", new String[] {"%"+path+"%"}, null);
        try {
            cursor.moveToFirst();
            do{
                PhotoItemModel pic = new PhotoItemModel();

                pic.setPicturName(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME)));

                pic.setPicturePath(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA)));

                pic.setPictureSize(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.SIZE)));

                images.add(pic);
            }while(cursor.moveToNext());
            cursor.close();
            ArrayList<PhotoItemModel> reSelection = new ArrayList<>();
            for(int i = images.size()-1;i > -1;i--){
                reSelection.add(images.get(i));
            }
            images = reSelection;
        } catch (Exception e) {
            e.printStackTrace();
        }
    return images;
}

我该如何解决这个问题?

最佳答案

首先检查 Android Q 是否在访问文件夹路径时出现一些问题(与权限相关)

String folderpaths = datapath.substring(0, datapath.lastIndexOf(folder + "/"));
folderpaths = folderpaths + folder + "/";

关于java - 在 Android Q 之前可以获取带有相册的图像,但在 Android Q 上则不行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61678061/

相关文章:

java - Apache 和 Tomcat 服务器中的多个站点

java - 如何使方法采用空值?

android - 在 Android 上实现消息访问配置文件(接收器端)?

android - 带有自定义 View 的多项选择列表?

android - 在 Android 中 .0 dp 是什么意思?

android - 如何获取 4.4 kitkat 上的铃声 URI

java - java中如何创建非静态全局变量?

java - Java 中什么类型的变量可以保存类似 IP 地址的具有多个小数的数字?

java - 如何在 DCIM 目录(范围存储)Android Q 中创建隐藏文件夹,即 .MyFolder [(dot)MyFolder]

android - 获取 Android 上的照片库列表