Java 如何在单个活动中添加多个onActivityResult(),而不转到其他活动?

Java 如何在单个活动中添加多个onActivityResult(),而不转到其他活动?,java,android,android-studio,android-camera,onactivityresult,Java,Android,Android Studio,Android Camera,Onactivityresult,我在一个活动中同时使用图像选择器和条形码阅读器。主要问题是这两种方法都需要onActivityResult()来显示结果。正如我们所知,单个活动中只能有一个onActivityResult()方法。我怎样才能同时显示它们 我曾尝试在onActivityResult()中使用开关案例分配多个请求代码,但似乎无法找到解决方案 这是我尝试过的方法 public class MainActivity extends AppCompatActivity{ private TextView mIdenti

我在一个活动中同时使用图像选择器和条形码阅读器。主要问题是这两种方法都需要onActivityResult()来显示结果。正如我们所知,单个活动中只能有一个onActivityResult()方法。我怎样才能同时显示它们

我曾尝试在onActivityResult()中使用开关案例分配多个请求代码,但似乎无法找到解决方案

这是我尝试过的方法

public class MainActivity extends AppCompatActivity{

private TextView mIdentificationNumber;
private IntentIntegrator scanQR;

//Authentication For Firebase.
private FirebaseAuth mAuth;

//Toolbar
private Toolbar mToolBar;

private DatabaseReference mUserRef;

private ImageView mAssetImg;
private EditText massetName, massetModel, massetBarcode, massetArea, massetDescription;

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

    //Getting the Present instance of the FireBase Authentication
    mAuth = FirebaseAuth.getInstance();

    //Finding The Toolbar with it's unique Id.
    mToolBar = (Toolbar) findViewById(R.id.main_page_toolbar);

    //Setting Up the ToolBar in The ActionBar.
    setSupportActionBar(mToolBar);

    if (mAuth.getCurrentUser() != null){

        mUserRef = FirebaseDatabase.getInstance().getReference().child("Users")
                .child(mAuth.getCurrentUser().getUid());
        mUserRef.keepSynced(true);

    }

    massetBarcode = (EditText) findViewById(R.id.BarcodeAsset);
    scanQR = new IntentIntegrator(this);
    massetBarcode.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            scanQR.initiateScan();

        }
    });

    mAssetImg = (ImageView) findViewById(R.id.asset_img);
    mAssetImg.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            getImage();
        }
    });

}

//OnStart Method is started when the Authentication Starts.
@Override
public void onStart() {
    super.onStart();
    // Check if user is signed in (non-null).
    FirebaseUser currentUser = mAuth.getCurrentUser();

    if (currentUser == null){

        startUser();

    } else {

        mUserRef.child("online").setValue("true");
        Log.d("STARTING THE ACTIVITY" , "TRUE");

    }
}

@Override
protected void onPause() {
    super.onPause();

    FirebaseUser currentUser = mAuth.getCurrentUser();

    if (currentUser != null){

        mUserRef.child("online").setValue(ServerValue.TIMESTAMP);
        Log.d("STOPPING THE ACTIVITY" , "TRUE");

    }

}

private void startUser() {

    //Sending the user in the StartActivity If the User Is Not Logged In.
    Intent startIntent = new Intent(MainActivity.this , AuthenticationActivity.class);
    startActivity(startIntent);
    //Finishing Up The Intent So the User Can't Go Back To MainActivity Without LoggingIn.
    finish();

}

//Setting The Menu Options In The AppBarLayout.
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    //Inflating the Menu with the Unique R.menu.Id.
    getMenuInflater().inflate(R.menu.main_menu , menu);

    return true;
}

//Setting the Individual Item In The Menu.(Logout Button)
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    super.onOptionsItemSelected(item);

    if (item.getItemId() == R.id.main_logout_btn){

        FirebaseAuth.getInstance().signOut();
        startUser();

    }

    return true;
}

private void getImage() {

    ImagePicker.Companion.with(this)
            .crop()                 //Crop image(Optional), Check Customization for more option
            .compress(1024)         //Final image size will be less than 1 MB(Optional)
            .maxResultSize(1080, 1080)  //Final image resolution will be less than 1080 x 1080(Optional)
            .start();

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {
        case 0:
            IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
            if (result != null) {
                if (result.getContents() == null) {
                    Toast.makeText(this, "Cancelled", Toast.LENGTH_LONG).show();
                } else {

                    massetBarcode.setText(result.getContents());

                    Toast.makeText(this, "Scanned: " + result.getContents(), Toast.LENGTH_LONG).show();
                }
            }
            break;

        case 1:
            if (resultCode == Activity.RESULT_OK) {

                assert data != null;
                Uri imageURI = data.getData();
                mAssetImg.setImageURI(imageURI);

            }
            break;
    }

}
}


其余答案都告诉我们使用startActivityForResult(),但该方法需要从一个活动转到另一个活动,但我不想这样做。

为了从活动片段中获得结果,您可以使用
接口来启用它们之间的通信

StartActivityForResult
用于启动活动并从中获取结果


请阅读更多关于它的信息

startActivityForResult方法可以使用第二个参数,一个数字,以便您可以区分结果

startActivityForResul(intent, 8)
您不需要在其他活动中设置代码,这些活动是在后台处理的。所以你可能想把这个数字作为常数加起来

private static final CAMERA_INTENT = 2
然后像这样使用它

startActivityForResul(intent, CAMERA_INTENT)
最后,在onActivityResult的
中,实现了案例基础

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {

if (CAMERA_INTENT == requestCode) {
    //DO PHOTO STUFF
}
}

您需要求值的参数是
requestCode

在这两种情况下,您使用的库提供了一种指定请求代码的方法,以便您可以在
onActivityResult
中区分结果

您的
scanQR
对象应设置请求代码:

您的
getImage()
方法还应该指定一个请求代码

现在,您可以根据需要处理每个请求代码:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {
        case 123:
            // HANDLE BARCODE
            break;

        case 456:
            // HANDLE IMAGE
            break;
    }
}
结束语:我从未使用过这两个库。我通过以下方式找到了解决方案:1)假设任何提供了您应该为结果调用的活动的库都允许您为其指定请求代码,2)查看它们的文档和源代码以了解如何做到这一点

我鼓励您彻底研究您打算使用的任何开源库的文档和源代码,因为一旦您这样做,它们的代码就会变成您的代码,它们的bug就会变成您的bug,这样您就更好地知道如何修复或解决它们


希望有帮助

你能发布你的片段代码吗?如果你想在两个活动之间通信,startActivityForResult将用不同的请求代码解决你的问题。但是,如果您想在片段和活动之间进行通信,您应该使用一个接口。请看@mohnage7嘿,我在问题中犯了一个错误,这不是一个片段,而是一个图像选择器,它直接进入图库来拾取图像,并在onActivityResult()方法中获取结果。startActivityForResult()需要intent作为参数,而实例化intent需要两个活动。我不想从一个活动转到另一个活动。同样,将显式意图更改为隐式意图
intent intent intent=new intent(intent.CAMERA\u ACTION);startActivityForResult(意向书,7)意图。摄像头\动作显示了一个你无法预料的错误,因此为你做了所有的工作。这里是常见意图的文档。这里是exlicit和implicit Intent的文档。这里是所有意图。你的问题是如何在1个活动中进行2个活动,这是解决方案,其他问题,其他帖子,我在问题中犯了一个错误,它不是一个片段,而是一个imagepicker,它直接进入图库拾取图像,并在onActivityResult()方法中获得结果。条形码阅读器是第三方库。我更正了这个问题。好-在这两种情况下,您都没有指定要在onActivityResult中使用的代码。显示扫描仪和图像选择器的代码,或指向正在使用的第三方库。ImagePicker-条形码扫描仪-
private void getImage() {
    ImagePicker.Companion.with(this)
        .crop()                 //Crop image(Optional), Check Customization for more option
        .compress(1024)         //Final image size will be less than 1 MB(Optional)
        .maxResultSize(1080, 1080)  //Final image resolution will be less than 1080 x 1080(Optional)
        .start(456); // Start with request code
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {
        case 123:
            // HANDLE BARCODE
            break;

        case 456:
            // HANDLE IMAGE
            break;
    }
}