【问题标题】:How to pass image gotten from camera or gallery to another activity如何将从相机或画廊获取的图像传递到另一个活动
【发布时间】:2020-01-05 17:30:54
【问题描述】:

1.用户选择一个按钮从图库上传或从相机拍摄

来自画廊

    choose_btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(Intent.ACTION_PICK);
            // Sets the type as image/*. This ensures only components of type image are selected
            intent.setType("image/*");
            //We pass an extra array with the accepted mime types. This will ensure only components with these MIME types as targeted.
            String[] mimeTypes = {"image/jpeg", "image/png"};
            intent.putExtra(Intent.EXTRA_MIME_TYPES,mimeTypes);
            // Launching the Intent
            startActivityForResult(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。用户从图库中选择一张照片或从相机中拍摄,图像显示在当前活动中

public void onActivityResult(int requestCode,int resultCode,Intent data){
............//grant permission codes here

//If it is from gallery
if (requestCode == 1 && resultCode == RESULT_OK && null != data) { 
     Uri selectedImage = data.getData();
     String[] filePathColumn = { MediaStore.Images.Media.DATA };
     Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null); 
     cursor.moveToFirst();   
     int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
     String imgDecodableString = cursor.getString(columnIndex);
     cursor.close();

     //Display image with glide
     Glide.with(this).asBitmap().load(imgDecodableString).into(new CustomTarget<Bitmap>() {
                    @Override
                    public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? 
     super Bitmap> transition) {
                        display_image.setImageBitmap(resource);
                        display_image.setVisibility(View.VISIBLE);
                    }    
}

//If request is from camera
if (resultCode == Activity.RESULT_OK)
        switch (requestCode){
            case 0:
                //Display image in current activity 
                Glide.with(this)
                        .load(cameraFilePath)
                        .into(display_image);
                /*display_image.setImageURI(Uri.parse(cameraFilePath));*/
                display_image.setVisibility(View.VISIBLE);
                break;
        }

}

3.我有一个“下一步”按钮,单击时我想将显示的图像(从画廊或相机中获取)传输到另一个活动,我还没有编写用于传递图像的代码

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

4.我想知道在不影响图像质量和内存的情况下执行此操作的最佳方法,因为在下一个活动 (UploadAcitivity3) 中,我将上传传递到服务器的图像并保存在目录中

【问题讨论】:

  • 将您的完整代码放在 Pastbin 中,以便我们了解您获取捕获图像和选取图像 uri 的位置

标签: java android android-intent


【解决方案1】:

请按照以下步骤实现:

选项 - 1:如果您想传递多张图片,请使用以下内容:

  • 步骤 - 1: 将选定的图像路径存储在 ArrayList 中,如下所示:
private ArrayList<String> selectedImages = new ArrayList<>();

public void onActivityResult(int requestCode,int resultCode,Intent data) {

    ............//grant permission codes here

    //If it is from gallery
    if (requestCode == 1 && resultCode == RESULT_OK && null != data) {

        ....

        String imgDecodableString = cursor.getString(columnIndex);

        selectedImages.add(imgDecodableString);
    }

    //If request is from camera
    if (resultCode == Activity.RESULT_OK) {
        selectedImages.add(cameraFilePath);
    }
}
  • 步骤 - 2:onClick 将所选图像列表设置为extrasintent
next_upload.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(UploadActivity2.this, UploadActivity3.class);
        intent.putStringArrayListExtra("SELECTED_IMAGES", selectedImages);
        startActivity(intent);
    }
});
  • 步骤 - 3:intent 中的UploadActivity3 中检索所选图像,如下所示:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {


    ....

    ArrayList<String> selectedImages = getIntent().getStringArrayListExtra("SELECTED_IMAGES");

}

选项 - 2:如果您想传递单个图像,请使用以下:

  • 步骤 - 1: 如下所示存储选定的图像路径:
private String selectedImage;

public void onActivityResult(int requestCode,int resultCode,Intent data) {

    ............//grant permission codes here

    //If it is from gallery
    if (requestCode == 1 && resultCode == RESULT_OK && null != data) {

        ....

        String imgDecodableString = cursor.getString(columnIndex);

        selectedImage = imgDecodableString;
    }

    //If request is from camera
    if (resultCode == Activity.RESULT_OK) {
        selectedImage = cameraFilePath;
    }
}
  • 步骤 - 2:onClick 将所选图像列表设置为extrasintent
next_upload.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(UploadActivity2.this, UploadActivity3.class);
        intent.putExtra("SELECTED_IMAGE", selectedImage);
        startActivity(intent);
    }
});
  • 步骤 - 3:intent 中的UploadActivity3 中检索所选图像,如下所示:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {


    ....

    String selectedImage = getIntent().getStringExtra("SELECTED_IMAGE");
    Glide.with(this).load(selectedImage).into(image_view);
}

【讨论】:

  • 任何字符串常量,如SELECTED_IMAGES
  • 谢谢。我尝试使用 glide 在 uploadActivity3 中显示图像。它没有显示。我得到 Failed to find any ModelLoaders for model: [/storage/emulated/0/imagename.png] for image selected in gallery 和 Failed to find any ModelLoaders for model: [file:/ //storage/emulated/0/DCIM/Camera/imganename.jpg] 用于使用相机拍摄的图像。??我用 Glide.with(this) .load(selectedImages) .into(image_view);
  • 让我明确一下,您一次要传递多少张图片给uploadActivity3
  • 在我的解决方案selectedImages 中包含图像列表。如果您传递单个图像,则在 uploadActivity3 中使用 Glide.with(this) .load(selectedImages.get(0)) .into(image_view);
  • 他只想传递一个图像,无论是图库还是捕获的图像。 @ibramazin 你必须使用 Glide.with(this) .load(selectedImages.get(0)) .into(image_view);像这样……
【解决方案2】:

可以通过Intent发送图片路径

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

您已经有用于捕获图像的图像路径是cameraFilePath

对于图库图片imgDecodableString

String imagePath;声明为类变量并在onActivityResult.中赋值

imagePath = imgDecodableString;//For Gallery


imagePath = cameraFilePath;//For Capture image

UploadActivity3.class中的接收路径

String imagePath = getIntent().getStringExtra("path");

根据需要在第二个活动中使用此路径。

【讨论】:

    猜你喜欢
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多