Как использовать onActivityResult дважды в одном действии - PullRequest
0 голосов
/ 01 июня 2019

error:method onActivityResult(int,int, Intent) is already defined in class scan.

Поэтому я пытаюсь создать приложение, в котором вы делаете снимок, а затем приложение обнаруживает текст на фотографии.К сожалению, я использую метод onActivityResult дважды.Так как я новичок в кодировании и в целом немного глуп, я не знаю, как решить эту проблему.

добавление числа 1 за отступами, где я их впервые использовал, но хорошо, что не получилосьэто

private void camera(){
    Intent intent2 = new Intent (MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(intent2, 0);
}
@Override
protected void onActivityResult (int requestCode1, int resultCode1 , Intent data1) {
    super.onActivityResult(requestCode1,resultCode1,data1);
    if (resultCode1==RESULT_OK){
        Bitmap btp = (Bitmap) data1.getExtras().get("data");
        imageView.setImageBitmap(btp);
    }
}

public void detect (View v){
    if (bitmap == null){
        Toast.makeText(getApplicationContext(),"Bitmap is null",Toast.LENGTH_SHORT).show();
    }
    else {
        FirebaseVisionImage firebaseVisionImage = FirebaseVisionImage.fromBitmap(bitmap);
        FirebaseVisionTextRecognizer firebaseVisionTextRecognizer = FirebaseVision.getInstance().getOnDeviceTextRecognizer();
        firebaseVisionTextRecognizer.processImage(firebaseVisionImage)
                .addOnSuccessListener(new OnSuccessListener<FirebaseVisionText>() {
                    @Override
                    public void onSuccess(FirebaseVisionText firebaseVisionText) {
                        process_text(firebaseVisionText);
                    }
                });

    }

}

private void process_text(FirebaseVisionText firebaseVisionText) {
    List<FirebaseVisionText.TextBlock> blocks = firebaseVisionText.getTextBlocks();
    if (blocks.size() == 0){
        Toast.makeText(getApplicationContext(),"no text detected",Toast.LENGTH_LONG).show();
    }
    else {
        for (FirebaseVisionText.TextBlock block:firebaseVisionText.getTextBlocks()){
            String text = block.getText();
            textView.setText(text);
        }
    }
}

public void pick_image(View v){
    Intent i = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI);
    startActivityForResult(i,1);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == 1 && resultCode == RESULT_OK)
    {
        Uri uri = data.getData();
        try {
            bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(),uri);
            imageView.setImageBitmap(bitmap);
        }catch (IOException e){
            e.printStackTrace();
        }

    }
}

ошибка: метод onActivityResult (int, int, Intent) уже определен в классе сканирования

Ответы [ 3 ]

0 голосов
/ 01 июня 2019

Определите код запроса внутри вашего класса static final int REQUEST_PHOTO_1 = 1; static final int REQUEST_PHOTO_2 = 2;

Тогда при звонке используйте

startActivityForResult(intent1, REQUEST_PHOTO_1);
startActivityForResult(intent2, REQUEST_PHOTO_2);

Теперь в onActivityResult вы можете сделать что-то вроде этого.

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == REQUEST_PHOTO_1 && resultCode == RESULT_OK)
{
    ....
}
else if(requestCode == REQUEST_PHOTO_2 && resultCode == RESULT_OK)
{
    ....
}
else if (resultCode==RESULT_OK){
    Bitmap btp = (Bitmap) data.getExtras().get("data");
    imageView.setImageBitmap(btp);
}
}
0 голосов
/ 01 июня 2019

Посмотрите на документацию и ссылка .

Второй параметр startActivityForResult(Intent intent, int requestCode) - это код запроса, который будет передан в качестве первого параметра onActivityResult(int requestCode, int resultCode, Intent data).

Пример:

private void camera(){
    Intent intent2 = new Intent (MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(intent2, 0);
}

public void pick_image(View v){
    Intent i = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI);
    startActivityForResult(i, 1);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(resultCode == RESULT_OK)
    {
        switch(requestCode){
            case 0: // handle camera
                Bitmap btp = (Bitmap) data1.getExtras().get("data");
                imageView.setImageBitmap(btp);
            break;
            case 1: // handle pick_image
               Uri uri = data.getData();
               try {
                   bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);
                   imageView.setImageBitmap(bitmap);
               } catch (IOException e){
                   e.printStackTrace();
               }
            break;
        }
    }
}

Как видно из документации, вы должны преобразовать коды запросов в константы классов для лучшей читаемости и облегчения понимания.

0 голосов
/ 01 июня 2019

Вы просто должны положить его в один onActivityResult.

    @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == 1 && resultCode == RESULT_OK)
    {
        Uri uri = data.getData();
        try {
            bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(),uri);
            imageView.setImageBitmap(bitmap);
        }catch (IOException e){
            e.printStackTrace();
        }

    }
if (resultCode==RESULT_OK){
        Bitmap btp = (Bitmap) data.getExtras().get("data");
        imageView.setImageBitmap(btp);
    }
}
...