【问题标题】:Unable to pass separate Uri of two images through intent无法通过意图传递两个图像的单独 Uri
【发布时间】:2024-01-19 23:38:01
【问题描述】:

我不确定我做错了什么。我已经尝试了很多来修复此代码,但无济于事。基本上,用户在活动 A 上单击了两个图像。图像称为医学账单和其他账单。 Uri.getPath() 通过意图将每个图像传递给活动 B。但在活动 B 中,我为两个图像获得了相同的 Uri,因此无法同时加载它们。 Scale image 是一个缩小图像尺寸的功能。

    btnAddMedicineBill.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            File f=getOutputMediaFile("Medit_medicine");
            medicineBillUri = Uri.fromFile(f);
            Intent i=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            i.putExtra(MediaStore.EXTRA_OUTPUT, medicineBillUri);
            startActivityForResult(i, BILL_IMAGE_MEDICINE);
        }
    });

    btnAddOtherBill.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {               
            File f=getOutputMediaFile("Medit_Other");
            otherBillUri = Uri.fromFile(f);
            Intent i=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            i.putExtra(MediaStore.EXTRA_OUTPUT, otherBillUri);
            startActivityForResult(i, BILL_IMAGE_OTHER);
        }
    });

图像保存到的路径生成器

private File getOutputMediaFile(String name) {
        File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_DCIM), "medit_app");
        if (! mediaStorageDir.exists()){
            mediaStorageDir.mkdirs();
        }
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        File mediaFile;
        mediaFile = new File(mediaStorageDir.getPath() + File.separator +
                name+timeStamp + ".jpg");
        Log.d("reached a", mediaFile.toString());
        return mediaFile;
    }

onActivityResult()代码如下-

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Log.d(String.valueOf(requestCode), String.valueOf(resultCode));

        if (requestCode==BILL_IMAGE_MEDICINE){
            if (resultCode==RESULT_OK) {
                Bitmap bitmap = ScaleImage(medicineBillUri.getPath());
                ivMedicineBillImage.setImageBitmap(bitmap);
                _medicineImageTaken =true;
                }
        }
        if (requestCode==BILL_IMAGE_OTHER){
            if (resultCode==RESULT_OK) {
                Bitmap bitmap1 = ScaleImage(otherBillUri.getPath());
                ivOtherBillImage.setImageBitmap(bitmap1);
                _otherImageTaken =true;
            }
        }
    }

Activity B 的 startActivity()

Intent intentToStamp = new Intent(ActivityA.this, ActivityB.class);
intentToStamp.putExtra(BILL_OTHER_IMAGE_URL, otherBillUri.getPath());
intentToStamp.putExtra(BILL_MEDICINE_IMAGE_URL, medicineBillUri.getPath());
Log.d("Other Bill",otherBillUri.getPath() );
Log.d("Medicine Bill",medicineBillUri.getPath() );

此时的日志值

Other Bill﹕ /storage/emulated/0/DCIM/medit_app/Medit_Other20151123_152716.jpg
Medicine Bill﹕ /storage/emulated/0/DCIM/medit_app/Medit_medicine20151123_152707.jpg

最后是 Activity B 中的 getExtras() 代码

Intent intent=getIntent();
medicineBillImageUrl =intent.getStringExtra(BILL_MEDICINE_IMAGE_URL);
Log.d("Medicine", medicineBillImageUrl)
otherBillImageUri =intent.getStringExtra(BILL_OTHER_IMAGE_URL);
Log.d("Other", otherBillImageUri);

此时两个日志都显示为

Medicine Bill﹕ /storage/emulated/0/DCIM/medit_app/Medit_medicine20151123_152707.jpg
Other Bill﹕ /storage/emulated/0/DCIM/medit_app/Medit_medicine20151123_152707.jpg

实际图像也被存储为 /storage/emulated/0/DCIM/Camera/20151123_152707.jpg

【问题讨论】:

  • 检查,BILL_MEDICINE_IMAGE_URL 和 BILL_OTHER_IMAGE_URL 字符串有不同的值
  • 我更喜欢使用字符串来处理这些路径,在意图上你可以轻松传递,而在其他活动上转换会更好。
  • 我不明白。我使用字符串作为我在 Constants.class (public static String A_B_C ="a_b_c" ) 中定义的意图的标识符,以避免拼写错误。

标签: android android-intent android-camera uri android-camera-intent


【解决方案1】:

您需要为

定义不同的键
i.putExtra(MediaStore.EXTRA_OTHER_BILL, otherBillUri);

i.putExtra(MediaStore.EXTRA_MEDICINE_BILL, medicineBillUri);

【讨论】:

    最近更新 更多