【问题标题】:unable to pass bundle data from image File Chooser intent to onActivityResult无法将图像文件选择器意图中的捆绑数据传递给 onActivityResult
【发布时间】:2019-09-16 03:03:35
【问题描述】:

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

【问题讨论】:

  • 你真的不能那样做。启动的应用程序不会期待额外的东西,所以它非常不太可能做任何事情来确保它在结果Intent 上。您需要自己跟踪;例如,通过将其持久化到存储中 - 可能只使用 SharedPreferences - 或者通过在 onSaveInstanceState()onRestoreInstanceState() 方法中将其放入 Activity 的保存状态 Bundle 并从中检索它。
  • 您可以通过传递不同的请求代码并检查活动结果来实现

标签: java android


【解决方案1】:

首先欢迎来到 SO 社区。

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

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

在您的示例中,您用于打开 FileChooser 活动组件的意图与返回的 onActivityResult() 不同。后者不是由开发者派生的,它只是 android 系统在您与 FileChooser 交互时创建的一种新的不同意图;如果你真的选择了一个文件,那么它会返回一个用数据定制的意图(结果为RESULT_OK)。如果你什么都不选择,它会返回 null,结果为 (RESULT_CANCELED)。

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-07
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多