Установите два обрезанных изображения с камеры отдельно в режиме просмотра изображений (Android Studio) - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь взять два изображения с камеры и обрезать изображение, а затем показать обрезанное изображение в двух Imageview отдельно. У меня есть 2 Button, чтобы открыть одну камеру для захвата первого изображения, затем обрезать, чтобы отобразить его в Imageview, а второе сделать то же самое.

Мой код в MainActivity

переменная в калибре

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

ImageView iv, iv1;
Button bt, bt1;

при создании метода

 @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 () и 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 ()

    // 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

@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

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

Функция обрезанного изображения

  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);

}

____________________________________________________________________________

Проблема

Обрезанное изображение для второго Button, установленное в первом Imageview. Нужно найти способ добраться до iv1 в onActivityResult для второй камеры Button.

Есть предложения?

Использование библиотеки для обрезки изображения

СПАСИБО.

1 Ответ

0 голосов
/ 08 ноября 2018

Глядя на проблемы в репозитории GitHub, я обнаружил этот , который кажется похожим на ваш, вы можете установить собственный код запроса при запуске операции обрезки.

Таким образом, вы можете начать действие с 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)
}

Я предлагаю также использовать оператор switch при проверке кода запроса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...