简体   繁体   English

在图像视图中分别从相机设置两个裁剪的图像(Android Studio)

[英]Set two cropped image from camera separately in image view (Android Studio)

I am try to take two image from camera and crop image then show cropped image in two Imageview separately. 我尝试从相机拍摄两个图像并裁剪图像,然后分别在两个Imageview显示裁剪的图像。 I have 2 Button to open camera one for capture first image then cropped to display it in Imageview and the second do the same thing. 我有2个Button来打开相机,一个用于捕捉第一个图像,然后裁剪以在Imageview显示它,第二个做相同的事情。

My code in MainActivity 我在MainActivity代码

variable in calss 可变的

static int CAMERA_REQUEST_CODE = 228;
static int CAMERA_REQUEST_CODE1 = 229;
Uri pictureUri = null;

ImageView iv, iv1;
Button bt, bt1;

onCreate method onCreate方法

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    iv = findViewById(R.id.iv);
    bt = findViewById(R.id.bt);

    iv1 = findViewById(R.id.iv1);
    bt1 = findViewById(R.id.bt1);


    bt.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            invokeCamera();
        }
    });

    bt1.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            invokeCamera1();
        }
    });

}

invokeCamera() and invokeCamera1() function invokeCamera()和invokeCamera1()函数

public void invokeCamera() {

    // get a file reference
    pictureUri = FileProvider.getUriForFile(this, getApplicationContext().getPackageName(), createImageFile()); // Make Uri file example file://storage/emulated/0/Pictures/Civil_ID20180924_180619.jpg

    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // Go to camera

    // tell the camera where to save the image.
    intent.putExtra(MediaStore.EXTRA_OUTPUT, pictureUri);

    // tell the camera to request WRITE permission.
    intent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

    startActivityForResult(intent, CAMERA_REQUEST_CODE);
}

public void invokeCamera1() {

    // get a file reference
    pictureUri = FileProvider.getUriForFile(this, getApplicationContext().getPackageName(), createImageFile()); // Make Uri file example file://storage/emulated/0/Pictures/Civil_ID20180924_180619.jpg

    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // Go to camera

    // tell the camera where to save the image.
    intent.putExtra(MediaStore.EXTRA_OUTPUT, pictureUri);

    // tell the camera to request WRITE permission.
    intent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

    startActivityForResult(intent, CAMERA_REQUEST_CODE1);
}

createImageFile() function createImageFile()函数

    // To create image file in pictures directory
public File createImageFile() {
    // the public picture director
    File picturesDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); // To get pictures directory from android system

    // timestamp makes unique name.
    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
    String timestamp = sdf.format(new Date());

    // put together the directory and the timestamp to make a unique image location.
    File imageFile = new File(picturesDirectory, timestamp + ".jpg");

    return imageFile;
}

onActivityResult function onActivityResult函数

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent 
 data) {
    super.onActivityResult(requestCode, resultCode, data);

    if(resultCode == RESULT_OK)  // resultCode: -1
    {
        if(requestCode == CAMERA_REQUEST_CODE ) // requestCode: 288
        {
            Uri picUri = pictureUri;
            startCropImageActivity(picUri);
            Toast.makeText(MainActivity.this, "Image 1 save", 
Toast.LENGTH_SHORT).show();
        }
        if(requestCode == CAMERA_REQUEST_CODE1)
        {
            Uri picUri = pictureUri;
            startCropImageActivity(picUri);
            Toast.makeText(MainActivity.this, "Image 2 save", 
Toast.LENGTH_SHORT).show();
        }
    }

   if(requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE)
    {
        CropImage.ActivityResult result = CropImage.getActivityResult(data);

            if(resultCode == RESULT_OK)
            {
                Croppedimage(result, iv); // my problem !

                /*
                *  Here i want to use if or switch statement to can use iv1 
for second camera button! HOW?
                *  
                * example 
                * 
                * if(for first camera button)
                * {
                *   Croppedimage(result, iv);
                * }
                * 
                * if(for second camera button)
                * {
                *   Croppedimage(result, iv1);
                * }
                *
                * */

            }

        else if(resultCode == 
CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE)
        {
            // if there is any error show it
            Exception error = result.getError();
            Toast.makeText(this, "" + error, Toast.LENGTH_LONG).show();
        }
    }
}

startCropImageActivity function startCropImageActivity函数

    private void startCropImageActivity(Uri imageUri) {
    CropImage.activity(imageUri)
            .setGuidelines(CropImageView.Guidelines.ON)
            .setMultiTouchEnabled(true)
            .start(this);
}

Croppedimage function 裁剪图像功能

  public void Croppedimage(CropImage.ActivityResult result,ImageView iv)
{
    Uri resultUri = null; // get image uri
    if (result != null) {
        resultUri = result.getUri();
    }

    //set image to image view
    iv.setImageURI(resultUri);

}

____________________________________________________________________________ ____________________________________________________________________________

The problem 问题

The cropped image for second Button set in first Imageview . 在第一个Imageview设置的第二个Button的裁剪图像。 Need to find way to reach to iv1 in onActivityResult for second camera Button . 需要在第二个Camera Button onActivityResult找到到达iv1方法。

Any suggestions? 有什么建议么?

Library use for crop image 库用于裁剪图像

THANKS. 谢谢。

Looking in the issues on the GitHub respository I found this one , that seems similar to yours, you can set a custom request code when starting the crop activity. 在GitHub储存库上的问题中,我发现了一个与您的储存库类似的问题,您可以在开始裁剪活动时设置自定义请求代码。

So you can start the activity with 2 different request codes and check which one has been used on onActivityResult 因此,您可以使用2个不同的请求代码启动活动,并检查onActivityResult使用了哪个请求代码

private static final RC_CROP = 100;
private static final RC_CROP1 = 200;

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    super.onActivityResult(requestCode, resultCode, data);

    if (resultCode == RESULT_OK)  // resultCode: -1
    {
        if (requestCode == CAMERA_REQUEST_CODE) // requestCode: 288
        {
            Uri picUri = pictureUri;
            startCropImageActivity(picUri, RC_CROP);
            Toast.makeText(MainActivity.this, "Image 1 save",
                    Toast.LENGTH_SHORT).show();
        }
        if (requestCode == CAMERA_REQUEST_CODE1) {
            Uri picUri = pictureUri;
            startCropImageActivity(picUri, RC_CROP1);
            Toast.makeText(MainActivity.this, "Image 2 save",
                    Toast.LENGTH_SHORT).show();
        }

        if (requestCode == RC_CROP) {
            CropImage.ActivityResult result = CropImage.getActivityResult(data);
            //put image on first ImageView
        }

        if (requestCode == RC_CROP1) {
            CropImage.ActivityResult result = CropImage.getActivityResult(data);
            //put image on second ImageView
        }

    } else if (resultCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE) {
        // if there is any error show it
        Exception error = result.getError();
        Toast.makeText(this, "" + error, Toast.LENGTH_LONG).show();
    }
}


private void startCropImageActivity(Uri imageUri, int requestCode) {
    Intent vCropIntent = CropImage.activity(imageUri)
            .setGuidelines(CropImageView.Guidelines.ON)
            .setMultiTouchEnabled(true)
            .getIntent(this);

    startActivityForResult(vCropIntent, requestCode)
}

I suggest also to use a switch statement when checking the requestCode 我建议在检查requestCode时也使用switch语句

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM