如何从手机(外部/内部)存储中选择图像并上传到 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 数据库?的主要内容,如果未能解决你的问题,请参考以下文章

捕获图像而不将其存储到内部/外部存储

从 JSON url 下载图像不起作用。 [关闭]

如何将位图添加到电话库?

如何将图像从颤动的资产上传到firebase存储?

如何从图库中选择图像并保存到 xamarin 中的 sql 数据库

Alamofire - 使用照片时图像上传失败