繁体   English   中英

无法将图像文件选择器意图中的捆绑数据传递给 onActivityResult

[英]unable to pass bundle data from image File Chooser intent to 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();
                }
            }
````````

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM