android - 使用持久数据管理本地图像
问题描述
我正在努力理解在 android 中关联图像和持久数据对象的简单解决方法。更详细地说,我建立了一个简单的房间持久性架构,现在我需要向 java 持久化对象添加一个字段“图像”。我尝试使用 uri,但我对 Android 的了解很差,我得到的是,我在使用 android 文件管理器选择图像时恢复的 uri 仅在重新启动之前有效,所以如果我要保存如此获得uri 在数据库中,以后恢复时就没有意义了。我应该如何管理?
基本上我需要的是一种简单的方法,将对象链接到手机中存储的本地图像(或用相机动态捕捉),不用担心用户或任何东西删除图像,只是一种简单的方法。
例如,我试图修改谷歌代码示例,但我显然失败了,因为我不知道我在做什么
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);
解决方案
使用android文件管理器选择图像时恢复的uri仅在重新启动之前有效,因此如果我将如此获得的uri保存在数据库中,以后恢复时将毫无意义
这不太准确。
Uri
您通过 via 拉入的A对于任何获得viaACTION_OPEN_DOCUMENT
的活动都有好处。如果将其传递给另一个组件,则可以使用允许该组件读取该处的内容。但是,一旦您的流程结束,您对该内容的访问权限就会消失。Uri
onActivityResult()
Uri
FLAG_GRANT_READ_URI_PERMISSION
Uri
由于您使用了ACTION_OPEN_DOCUMENT
,因此您可以使用takePersistableUriPermission()
request 来长期访问内容,但这仅在内容仍然存在时才有效。如果用户删除内容,或者甚至移动它,您将失去访问权限。
例如,我试图修改谷歌代码示例,但我显然失败了,因为我不知道我在做什么
takePersistableUriPermission()
不返回ParcelFileDescriptor
. 否则,那个特定的电话似乎没问题。
关于加载图片,请使用现有的图片加载库(例如,Glide、Picasso)。
推荐阅读
- google-sheets - 如何检测谷歌表格中一列中0到1的第一个变化?
- apache-spark - LibSVM:了解数据格式
- python - 为什么我的神经网络无法正确分类?
- google-play - 从 Google Play 到 Google Cloud Storage 的统计数据
- r - 从函数中使用反应性(在 Shiny 中)
- react-native - 反应原生请求
- multithreading - 多线程并没有加速程序
- firebase - 如何使用 Flutter 对 Firebase 中的集合进行排序?
- powershell - 获取邮箱文件夹权限
- node.js - 如何在nodejs中显示来自json文件的图像