如何在一个 Activity 中使用两次 onActivityResult

How to use onActivityResult twice in one Activity

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) 已经在 class scan

中定义

你只需要把它放在一个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);
    }
}

在您的 class 中定义请求代码 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);
}
}

看看at the documentation and the reference.

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

如文档所示,您应该将请求代码重构为 class 常量,以便更好地阅读和理解。