如何从手机(外部/内部)存储中选择图像并上传到 sqlite 数据库?
Posted
技术标签:
【中文标题】如何从手机(外部/内部)存储中选择图像并上传到 sqlite 数据库?【英文标题】:How to choose image from phone (external / internal) storage and upload to sqlite database? 【发布时间】:2021-09-14 22:34:44 【问题描述】:我正在开发一个应用程序,并且在最重要的活动中必须发生以下情况:
用户填写表格并从手机中选择图片。 当他单击添加数据时,我想将所选图像(或路径,任何可以让我稍后检索它的任何内容)保存到本地数据库并稍后在其他活动中检索。我尝试过的事情:
将图像作为 blob 保存到 db 并稍后作为位图检索,但显然我了解到当使用更大尺寸的图像时这会失败,blob 设置为 null。 尝试获取所选图像的文件路径,但该文件路径的格式类似于:/document/msf:35
然后我尝试使用这些 SO 答案获取物理路径:link1、link2、link3 以及这些答案通常:link4、link5。
请不要将此标记为重复,因为其他答案中的解决方案对我不起作用
上传照片的打开意图:
// upload photo
photoActivityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>()
public void onActivityResult(ActivityResult result)
if (result.getResultCode() == Activity.RESULT_OK)
Intent intent = result.getData();
if (intent.getData() == null)
Log.d("AddTrip", "null data from image");
Uri uri = intent.getData();
// processing here..
);
private void uploadPhotoClicked()
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
photoActivityResultLauncher.launch(intent);
请提出解决此问题的解决方案以及实现此类功能的最佳实践,我已尝试使用 PathUtil,但它没有为某些图像提供路径。
【问题讨论】:
如果您使用托管服务,您可能希望将图片上传到File Manager
或其他地方(例如cPanel
)并将URL 存储在数据库中。
我没有使用托管服务。我存储的所有内容都在本地 sqlite 数据库中。
您应该将 uri.toString() 保存到数据库。不是 uri.getPath()。
并使用 ACTION_OPEN_DOCUMENT 而不是 ACTION_GET_CONTENT,这样您就可以在 uri.toString() 上获得持久 uri 权限。
【参考方案1】:
@blackapps 建议使用 ACTION_OPEN_DOCUMENT,我找到了解决方案。首先我通过intent.getDataString()
收到了Uri dataString,然后我解析了它,所以我可以调用takePersistableUriPermission()
。
现在我可以从 db 中检索 Uri 并调用 setImageUri(uri)
来检索图像。
photoActivityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>()
public void onActivityResult(ActivityResult result)
if (result.getResultCode() == Activity.RESULT_OK)
Intent intent = result.getData();
if (intent.getData() == null)
Log.d("AddTrip", "null data from image");
image = intent.getDataString();
Uri uri = Uri.parse(image);
context.getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
imageName.setText(image);
);
private void uploadPhotoClicked()
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.setType("image/*");
photoActivityResultLauncher.launch(intent);
【讨论】:
更好:Uri uri = intent.getData();以上是关于如何从手机(外部/内部)存储中选择图像并上传到 sqlite 数据库?的主要内容,如果未能解决你的问题,请参考以下文章