无法将bundle数据从图像文件选择器意图传递到 onActivityResult



在Android Studio 3.4项目活动中,有四个不同的按钮,单击时会传递不同的字符串值(标志(。我正在尝试从图像文件选择器中的变量字符串标志传递捆绑包数据以onActivityResult()

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

这是四个按钮之一的代码。

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

private void showFileChooser(final String flg) {
Intent intent = new Intent();
intent.putExtra("flg", flg);
setResult(Activity.RESULT_OK, 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);

if (myTag.equalsIgnoreCase("pic")) {
imageView.setImageBitmap(bitmap);
} else if (myTag.equalsIgnoreCase("License")) {
imageViewLicense.setImageBitmap(bitmap);
} else if (myTag.equalsIgnoreCase("RoadWorthiness")) {
imageViewRoadWorthiness.setImageBitmap(bitmap);
} else if (myTag.equalsIgnoreCase("Insurance")) {
imageViewInsurance.setImageBitmap(bitmap);
} else {

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

简短的回答:你不能那样做

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

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

这导致我们在代码中使用setResult(Activity.RESULT_OK, intent);并不重要,因为 android 系统会根据用户是否选择文件来更改它,而不管您用于打开 FileChooser 的传入意图如何。

更多信息: https://developer.android.com/training/basics/intents/result

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

带有请求代码的解决方案

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();
}
}
````````

最新更新