使用持久数据管理本地图像

时间:2018-05-19 17:59:15

标签: android persistence android-room storage-access-framework

我很难理解在android中关联图像和持久数据对象的简单解决方法。更详细的说,我提出了一个简单的房间持久性架构,现在我需要添加一个字段" image"到java持久化对象。我曾经尝试过使用uri,但我对Android的了解非常差,而且我得到的是我在使用android文件管理器选择图像时恢复的uri只有在重启后才有效,所以如果我保存如此在数据库中获得uri,以后恢复时没有任何意义。我应该如何管理?

基本上我需要的是一种简单的方法,可以将对象链接到存储在手机中的本地图像(或者使用相机随时捕获),无需担心用户或其他任何图像被删除,只需一种简单的方法。

对于istance,我试图修改谷歌代码示例,但我显然失败了因为我不知道我在做什么

private Bitmap getBitmapFromUri(Uri uri) throws IOException {
        ParcelFileDescriptor parcelFileDescriptor =
                getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
        Bitmap image = BitmapFactory.decodeFileDescriptor(fileDescriptor);
        parcelFileDescriptor.close();
        return image;
    }

此代码导致编译错误,在takePersistableUriPermission调用时需要:parcedDescriptor ...和VOID。我甚至都不知道这是否能解决我的问题。

这是我用来从本地图像获取uri的代码,但我还计划让相机拍摄照片并将其传递给保存/链接

// ACTION_OPEN_DOCUMENT is the intent to choose a file via the system's file
                // browser.
                Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);

                // Filter to only show results that can be "opened", such as a
                // file (as opposed to a list of contacts or timezones)
                intent.addCategory(Intent.CATEGORY_OPENABLE);

                // Filter to show only images, using the image MIME data type.
                // If one wanted to search for ogg vorbis files, the type would be "audio/ogg".
                // To search for all documents available via installed storage providers,
                // it would be "*/*".
                intent.setType("image/*");

                startActivityForResult(intent, READ_REQUEST_CODE);

1 个答案:

答案 0 :(得分:1)

  我在使用android文件管理器选择图像时恢复的uri仅在重启之前有效,所以如果我将如此获得的uri保存在数据库中,那么以后恢复将毫无意义

这不太准确。

通过Uri提取的ACTION_OPEN_DOCUMENT对于通过Uri获取onActivityResult()的任何活动都有好处。如果您将Uri传递给其他组件,则可以使用FLAG_GRANT_READ_URI_PERMISSION来允许该组件读取Uri处的内容。但是,一旦您的流程结束,您对该内容的访问就会消失。

由于您使用了ACTION_OPEN_DOCUMENT,因此您可以使用takePersistableUriPermission()请求对内容进行长期访问,但这仍然只有在内容仍然存在的情况下才有效。如果用户删除了内容,或者甚至移动了内容,您将失去访问权限。

  

对于istance,我试图修改谷歌代码示例,但我显然失败了因为我不知道我在做什么

takePersistableUriPermission()不会返回ParcelFileDescriptor。否则,该特定呼叫似乎没问题。

关于加载图片,使用现有的图片加载库(例如Glide,Picasso)。