java - 如何使用 Android 上传服务上传从相机获取的图像

标签 java android android-studio upload

我已经能够让用户将从其图库中拍摄的照片上传到服务器,但是当用户使用相机实时捕捉并上传时,我收到此错误不支持的方案:文件:://​​/storage/...

我正在使用android上传服务库

implementation "net.gotev:uploadservice:3.5.2"

我搜索发现file://方案不允许与Intent附加。

<强>1。单击按钮时从相机中选择图像

capture_btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            try {
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                intent.putExtra(MediaStore.EXTRA_OUTPUT, 
 FileProvider.getUriForFile(UploadActivity2.this, BuildConfig.APPLICATION_ID + ".provider", 
 createImageFile()));
                startActivityForResult(intent, 0);
            } catch (IOException ex) {
                ex.printStackTrace();
            }

        }
    });

<强>2。获取图像捕获

if (resultCode == Activity.RESULT_OK)
        switch (requestCode){
            case 0:
  try {
                 Uri cameraPath =    FileProvider.getUriForFile(UploadActivity2.this, 
  BuildConfig.APPLICATION_ID + ".provider", createImageFile());
                 String stringUri = cameraPath.toString();
                 selectedImages.add(stringUri);

                }catch (IOException ex) {
                    ex.printStackTrace();
 Glide.with(this)
                        .load(cameraFilePath)
                        .into(display_image);
 break;
        }
     }

如您所见,我使用文件提供程序来获取 uri 并将 uri 存储在名为 selectedimages 的变量中,以便我可以通过 Intent 将其传递到发生上传的另一个 Activity

createImageFile方法

  private File createImageFile() throws IOException {
    // Create an image file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.UK).format(new Date());
    String imageFileName = "JPEG_" + timeStamp + "_";
    //This is the directory in which the file will be created. This is the default location of Camera photos
    File storageDir = new File(Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_DCIM), "Camera");
    File image = File.createTempFile(
            imageFileName,  /* prefix */
            ".jpg",         /* suffix */
            storageDir      /* directory */
    );
    // Save a file: path for using again
    cameraFilePath = "file://" + image.getAbsolutePath();
    return image;
   }

<强>3。将intent PATH传递给uploadActivity

next_upload.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(UploadActivity2.this, UploadActivity3.class);
            intent.putStringArrayListExtra("PATH", selectedImages);
            startActivity(intent);
        }
    });

<强>5。上传发生的UploadAcvity

public void upload() {
    ArrayList<String> selectedImages = getIntent().getStringArrayListExtra("PATH");
try {
        String uploadId = UUID.randomUUID().toString();

        //Creating a multi part request
        new MultipartUploadRequest(this, uploadId, EndPoints.UPLOAD_URL)
                .addFileToUpload(selectedImages.get(0), "image") //Adding file
                .addParameter("caption", captionx) //Adding text parameter to the request
                .setNotificationConfig(new UploadNotificationConfig())
                .setMaxRetries(0)
                .startUpload(); //Starting the upload

    } catch (Exception exc) {
        Toast.makeText(this, exc.getMessage(), Toast.LENGTH_SHORT).show();
    }
}

使用这个。

a.使用 Glide.with(this) 在第 2 点中未显示图像 .load(相机文件路径) .into(display_image);

b.图片已上传,但它是一个 0 字节的空文件。

但是当我将点 2selectedImages 的变量值从 selectedImages.add(stringUri); 更改为 selectedImages.add(cameraFilePath);

b.点击上传后,出现错误不支持的方案:文件:://​​/storage/

最佳答案

找到了答案。

1.createImageFile方法中。我必须使用 -

从捕获的文件中获取 content://url
File newFile = new File(storageDir, image.getName());
    contentUrl = FileProvider.getUriForFile(UploadActivity2.this, 
BuildConfig.APPLICATION_ID + ".provider", newFile);
    stringContentUrl = contentUrl.toString();

2. 然后,我在捕获图像时将 stringContentUrl 传递到选定的图像字符串中。

selectedImages.add(stringContentUrl);

3. 通过 Intent Extra 传递它并在 uploadActivity 中调用它,如问题中的点 34 所示。

关于java - 如何使用 Android 上传服务上传从相机获取的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59637970/

相关文章:

android - 试图保存我的应用程序的日志,过滤它们并将它们发送到云端

java - 当我在模拟器上运行时,我的应用程序风格发生了变化

java - 我如何在java中管理多个文件和文件夹?

java - 带有 Spring-Security : Error creating bean with name 'oauth2TokenGranter' : Cannot create inner bean of type ResourceOwnerPasswordTokenGranter 的 Oauth2

java - 是什么导致运行完整的 GC?

java - 使用 Java 在 Android 中将接收 Intent 设置回默认值

android - MediaBrowserServiceCompat 无法绑定(bind)到服务

java - Android SQLite 搜索结果出错

java - 如何在 Java 中解析这样的 URI

java - 相同的 ArrayList 但不同的对象顺序