在Android 11的作用域存储中检索图像。

3

我正在开发一个扫描仪应用程序。我的问题是,在 Android 10 和 11 上从作用域存储中检索保存的图像时遇到了困难。图像已经成功保存,但我无法检索到它。当我获取保存图像的路径时,位图为 null

以下是在 Android 11 中保存图像的代码:

File dirDest = new File(Environment.DIRECTORY_PICTURES, context.getString(R.string.app_name));
Long date = System.currentTimeMillis();
String extension = ".jpg";

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    ContentResolver resolver = context.getContentResolver();
    ContentValues contentValues = new ContentValues();
    contentValues.put(MediaStore.Images.Media.DISPLAY_NAME, date + extension);
    contentValues.put(MediaStore.Images.Media.MIME_TYPE, "image/" + extension);
    contentValues.put(MediaStore.Images.Media.DATE_ADDED, date);
    contentValues.put(MediaStore.Images.Media.DATE_MODIFIED, date);
    contentValues.put(MediaStore.Images.Media.SIZE, bitmap.getByteCount());
    contentValues.put(MediaStore.Images.Media.WIDTH, bitmap.getWidth());
    contentValues.put(MediaStore.Images.Media.HEIGHT, bitmap.getHeight());
    contentValues.put(MediaStore.Images.Media.RELATIVE_PATH, dirDest + File.separator);
    Uri newImageUri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
    FileOutputStream fos = (FileOutputStream) resolver.openOutputStream(Objects.requireNonNull(newImageUri));
    callback.write(fos);
    fos.flush();
    fos.close();
    return String.valueOf(dirDest) + date + extension;

以下是从Android 11的分区存储中检索保存图像的代码。我在这部分代码中遇到了问题,位图为null。我不明白问题的关键点。最终问题是FileNotFoundException

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    String[] file = {MediaStore.Images.Media._ID,
    MediaStore.Images.Media.RELATIVE_PATH,
    MediaStore.Images.Media.DISPLAY_NAME,
    MediaStore.Images.Media.SIZE,
    MediaStore.Images.Media.MIME_TYPE,
    MediaStore.Images.Media.WIDTH,
    MediaStore.Images.Media.HEIGHT,
    MediaStore.Images.Media.DATE_MODIFIED};
    if (uri != null) {
        cursor = context.getContentResolver().query(uri, file, null, null, null);
        if (cursor != null) {
            try {
                cursor.moveToFirst();
                int columnIndex = cursor.getColumnIndex(file[0]);
                File path = new File(uri.getPath());
                bitmap = BitmapFactory.decodeFile(path.getAbsolutePath());
                cursor.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

这是从Android 11的作用域存储中检索共享存储中保存图像的代码--如果Uri是您之前从ContentResolver上的insert()获取的内容,则这些行都没有意义。相反,调用ContentResolver上的openInputStream(),传入您的Uri,以获取内容上的InputStream。然后,将该InputStream传递给BitmapFactory.decodeStream()。或者,更好的选择是考虑使用许多可用的图像加载库之一,例如Glide或Picasso。 - CommonsWare
你的代码似乎也缺少括号。是复制错误了吗? - Kelvin Schoofs
1个回答

0

你可以通过SimpleStorage的帮助查询它们全部:

val images: List<MediaFile> = MediaStoreCompat.fromMediaType(applicationContext, MediaType.IMAGE)
images.forEach { 
    println(it.absolutePath)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接