onActivityResult的行为不符合预期

时间:2020-04-29 12:29:16

标签: java android android-activity

我有一个选择图像的意图(我在一个片段中称呼它):

 Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("image/png");
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    String[] mimetypes = {"image/png","image/jpg", "image/bmp", "image/gif"};
    intent.putExtra(Intent.EXTRA_MIME_TYPES, mimetypes);
    // special intent for Samsung file manager
    Intent sIntent = new Intent("com.sec.android.app.myfiles.PICK_DATA");
    // if you want any file type, you can skip next line
    sIntent.putExtra("CONTENT_TYPE", "image/png");
    sIntent.addCategory(Intent.CATEGORY_DEFAULT);

    Intent chooserIntent;
    if (getContext().getPackageManager().resolveActivity(sIntent, 0) != null){
        // it is device with Samsung file manager
        chooserIntent = Intent.createChooser(sIntent, "Open file");
        chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { intent});
    } else {
        chooserIntent = Intent.createChooser(intent, "Open file");
    }

    try {
        startActivityForResult(chooserIntent, 548);
    } catch (android.content.ActivityNotFoundException ex) {
        Toast.makeText(getContext(), "No suitable File Manager was found.", Toast.LENGTH_SHORT).show();
    }

在我的活动中:

    @Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Log.d(TAG, "onActivityResult: request code: " + requestCode);
    Log.d(TAG, "onActivityResult: result: " + resultCode + " Success = " + (resultCode == RESULT_OK));
    if (requestCode == 548 && resultCode == RESULT_OK) {
        Uri uri = data.getData();
        Log.d(TAG, "onActivityResult: URI: " + uri.toString());
        Log.d(TAG, "onActivityResult: OK");

    }
}

输出: onActivityResult:请求代码:66084 onActivityResult:结果:-1 Success = true

如您所见,结果成功,但是请求代码更改了。所以我无法检查请求是什么。

1 个答案:

答案 0 :(得分:1)

您的startActivityForResult()通话应该与您的onActivityResult()通话相同。

因此,如果您希望onActivityResult()参加活动,请致电startActivityForResult()参加活动。

片段上的

startActivityForResult()有意更改requestCode,以最大程度地减少与其他startActivityForResult()调用的冲突,尤其是在同一活动中对其他片段进行的调用。