Java 无法将捆绑包数据从图像文件选择器意图传递到onActivityResult

Java 无法将捆绑包数据从图像文件选择器意图传递到onActivityResult,java,android,Java,Android,在android studio 3.4项目活动中,有四个不同的按钮,单击时传递不同的字符串值(标志)。我正试图将一个包数据从图像文件选择器意图中的变量字符串标志传递到onActivityResult() 有四个不同的图像选择器由四个按钮启动 如果传递了一个特定的字符串标志值,但我的字符串一直作为null传递,我希望我的方法做一些事情 这是四个按钮之一的代码 buttonChoose.setOnClickListener(新视图.OnClickListener(){ @凌驾 公共void onCl

在android studio 3.4项目活动中,有四个不同的按钮,单击时传递不同的字符串值(标志)。我正试图将一个包数据从图像文件选择器意图中的变量字符串标志传递到onActivityResult()

有四个不同的图像选择器由四个按钮启动 如果传递了一个特定的字符串标志值,但我的字符串一直作为null传递,我希望我的方法做一些事情

这是四个按钮之一的代码

buttonChoose.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
showFileChooser(“pic”);
}
});
私有void showFileChooser(最终字符串flg){
意图=新意图();
意向。额外交付(“flg”,flg);
设置结果(Activity.RESULT_OK,intent);
intent.setType(“image/*”);
intent.setAction(intent.ACTION\u GET\u CONTENT);
startActivityForResult(Intent.createChooser(Intent,“选择图片”),PICK\u IMAGE\u请求);
}
@凌驾
受保护的void onActivityResult(int请求代码、int结果代码、意图数据){
super.onActivityResult(请求代码、结果代码、数据);
if(requestCode==PICK\u IMAGE\u REQUEST&&resultCode==RESULT\u OK&&data!=null&&data.getData()!=null){
filePath=data.getData();
Log.d(标记“filePath 1>>”+filePath);
试一试{
位图=MediaStore.Images.Media.getBitmap(getContentResolver(),filePath);
字符串myTag=data.getStringExtra(“flg”);
Log.d(TAG,“myTag>>”+myTag);
if(myTag.equalsIgnoreCase(“pic”)){
设置图像位图(位图);
}else if(myTag.equalsIgnoreCase(“许可证”)){
设置图像位图(位图);
}其他条件(myTag.equalsIgnoreCase(“道路适用性”)){
设置图像位图(位图);
}else if(myTag.equalsIgnoreCase(“保险”)){
设置图像位图(位图);
}否则{
}
}捕获(IOE异常){
e、 printStackTrace();
}
}
````````

首先欢迎来到SO社区

简单的回答是:你不能那样做

原因是: 意图用于单目的单程旅行;不能在往返旅行中使用单一意图,尤其是当其中一个意图由系统触发时

在您的示例中,用于打开FileChooser活动组件的意图与在
onActivityResult()上返回的意图不同
。后者不是由开发人员派生的,但它只是android系统在您的操作与FileChooser交互时创建的一个新的不同意图;如果您确实选择了一个文件,那么它将返回一个使用数据定制的意图(结果为
result\u OK
)。如果您不选择任何内容,它将返回null,结果为(
结果\u已取消

这让我们知道,在代码中使用
setResult(Activity.RESULT\u OK,intent);
并不重要,因为android系统会根据用户是否选择文件而改变它,而不管您打开文件选择器的输入意图如何

有关更多信息:

您可以通过使用标志跟踪状态或利用onActivityResult()的requestCode来实现所需的功能 并为每个按钮单击设置具有不同值的标志/请求代码

带有请求代码的解决方案

private static final int PIC = 100;
private static final int LICENSE = 101;
private static final int ROAD_WORTHINESS = 102;
private static final int INSURANCE = 103;


buttonChoose.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        showFileChooser(PIC);
    }
});

buttonChoose2.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        showFileChooser(LICENSE);
    }
});

private void showFileChooser(int requestCode) {
    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(Intent.createChooser(intent, "Select Picture"), requestCode);
}


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK && data != null && data.getData() != null) {
        filePath = data.getData();
        Log.d(TAG, "filePath 1 >>" + filePath);

        try {
            bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), filePath);
            String myTag = data.getStringExtra("flg");

            Log.d(TAG, "myTag >>" + myTag);

            switch(requestCode) {
                case PIC:
                    imageView.setImageBitmap(bitmap);
                    break;
                case LICENSE:
                    imageViewLicense.setImageBitmap(bitmap);
                    break;
                case ROAD_WORTHINESS:
                    imageViewRoadWorthiness.setImageBitmap(bitmap);
                    break;
                case INSURANCE:
                    imageViewInsurance.setImageBitmap(bitmap);
                    break;
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
````````
带标志的解决方案

private static final int PIC = 100;
private static final int LICENSE = 101;
private static final int ROAD_WORTHINESS = 102;
private static final int INSURANCE = 103;
private int mState;

buttonChoose.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        mState = PIC;
        showFileChooser();
    }
});

buttonChoose2.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        mState = LICENSE;
        showFileChooser();
    }
});

private void showFileChooser() {
    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST);
}


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) {
        filePath = data.getData();
        Log.d(TAG, "filePath 1 >>" + filePath);

        try {
            bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), filePath);
            String myTag = data.getStringExtra("flg");

            Log.d(TAG, "myTag >>" + myTag);

            switch(mState) {
                case PIC:
                    imageView.setImageBitmap(bitmap);
                    break;
                case LICENSE:
                    imageViewLicense.setImageBitmap(bitmap);
                    break;
                case ROAD_WORTHINESS:
                    imageViewRoadWorthiness.setImageBitmap(bitmap);
                    break;
                case INSURANCE:
                    imageViewInsurance.setImageBitmap(bitmap);
                    break;
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
````````

你真的不能这么做。启动的应用程序不会期望额外的,所以它不太可能做任何事情来确保它在结果
意图
。你需要自己跟踪它;例如,通过将它持久化到存储中–可能只是使用
共享引用
–或者通过将它放入并检索它rom中,
活动
的保存状态
捆绑包
,在
onSaveInstanceState()
onRestoreInstanceState()
方法中。您可以通过传递不同的请求代码并在活动结果中进行检查来完成此操作