【问题标题】:How to choose image from phone (external / internal) storage and upload to sqlite database?如何从手机(外部/内部)存储中选择图像并上传到 sqlite 数据库?
【发布时间】:2021-09-14 22:34:44
【问题描述】:

我正在开发一个应用程序,并且在最重要的活动中必须发生以下情况:

  • 用户填写表格并从手机中选择图片。
  • 当他单击添加数据时,我想将所选图像(或路径,任何可以让我稍后检索它的任何内容)保存到本地数据库并稍后在其他活动中检索。

我尝试过的事情:

  • 将图像作为 blob 保存到 db 并稍后作为位图检索,但显然我了解到当使用更大尺寸的图像时这会失败,blob 设置为 null。
  • 尝试获取所选图像的文件路径,但该文件路径的格式类似于: /document/msf:35

然后我尝试使用这些 SO 答案获取物理路径:link1link2link3 以及这些答案通常:link4link5

请不要将此标记为重复,因为其他答案中的解决方案对我不起作用

上传照片的打开意图:

// 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 权限。

标签: android android-studio android-external-storage android-internal-storage


【解决方案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();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多