如何将URI传递给意图?


99

我正在尝试将URI对象传递给我的Intent,以便在另一个活动中使用该URI。

如何传递URI?

private Uri imageUri;
....
Intent intent = new Intent(this, GoogleActivity.class);
intent.putExtra("imageUri", imageUri);
startActivity(intent);
this.finish();

现在如何在其他活动中使用此URI?

 imageUri = extras.getString("imageUri"); // I know thats wrong ...

感谢你们



Answers:


178

您可以将uri存储为字符串

intent.putExtra("imageUri", imageUri.toString());

然后像这样将字符串转换回uri

Uri myUri = Uri.parse(extras.getString("imageUri"));

2
好的,很酷...但是我不知道如何将uri作为字符串存储:(
Robert El

在上面的代码中,将其转换为字符串。imageuri.toString()正在为您将uri转换为字符串。
拉夫兹

1
@malclocke有一个更好的解决方案。无需手动转换为字符串并返回。
Clocksmith

您可以使用intent.setData(imageUri);
邦塔帕纳

1
一会儿,我想知道“附加”是什么意思。简单来说: intent.putExtra("imageUrl", mImageUri.toString()); 在其他活动中 String imageUrl = getIntent().getStringExtra("imageUrl"); Uri mImageUri = Uri.parse(imageUrl);
Brian

136

Uri类实现Parcelable,所以你可以添加和直接从提取它Intent

// Add a Uri instance to an Intent
intent.putExtra("imageUri", uri);

// Get a Uri from an Intent
Uri uri = intent.getParcelableExtra("imageUri");

您可以对实现的任何对象使用相同的方法Parcelable,并且可以Parcelable根据需要在自己的对象上实现。


10
将来对任何人的提示:请确保您正在使用android.net.Uri而不是java.net.URI
Caleb Jares 2014年

4
供以后参考,如果在使用之前将多个附加对象放入Bundle对象中intent.putExtras(bundle);,请使用bundle.putParcelable("imageUri", uri);而不是intent.putExtra(...);直接在该Intent对象中使用。
Armando 2014年

数组也可以!i.putExtra("URIList", uriList.toArray());->List<Uri> myList = i.getParcelableArrayListExtra("URIList");
Pierre

推杆时遇到此错误java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Intent android.content.Intent.putExtra(java.lang.String, android.os.Parcelable)' on a null object reference
Omar Boshra

52

在Intent中,您可以直接放置Uri。您无需将Uri转换为字符串,然后再次转换回Uri。

看一下这种简单的方法。

// put uri to intent 
intent.setData(imageUri);

并让Uri摆脱意图:

// Get Uri from Intent
Uri imageUri=getIntent().getData();

1
警告:以上答案/解决方案不应用于本地广播,因为您可能会发现它们不会被接收。对于本地广播,最好使用malclocke的答案:stackoverflow.com/a/13981436/1617737
ban-geoengineering

1
private Uri imageUri;
....
Intent intent = new Intent(this, GoogleActivity.class);
intent.putExtra("imageUri", imageUri.toString());
startActivity(intent);
this.finish();


然后您可以像这样获取它:

imageUri = Uri.parse(extras.getString("imageUri"));

1

这是我的用法 我的CameraActionActivity Activity类中的此按钮,我称其为camera

 btn_frag_camera.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intenImatToSec = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
                startActivityForResult(intenImatToSec, REQUEST_CODE_VIDEO);
                //intenImatToSec.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
                //intenImatToSec.putExtra(MediaStore.EXTRA_DURATION_LIMIT, 10);
                //Toast.makeText(getActivity(), "Hello From Camera", Toast.LENGTH_SHORT).show();
            }
        });



@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {

            if (requestCode == REQUEST_CODE_IMG) {
                Bundle bundle = data.getExtras();
                Bitmap bitmap = (Bitmap) bundle.get("data");
                Intent intentBitMap = new Intent(getActivity(), DisplayImage.class);
                // aldıgımız imagi burda yonlendirdiğimiz sınıfa iletiyoruz
                ByteArrayOutputStream _bs = new ByteArrayOutputStream();
                bitmap.compress(Bitmap.CompressFormat.PNG, 50, _bs);
                intentBitMap.putExtra("byteArray", _bs.toByteArray());
                startActivity(intentBitMap);

            } else if (requestCode == REQUEST_CODE_VIDEO) {
                Uri videoUrl = data.getData();
                Intent intenToDisplayVideo = new Intent(getActivity(), DisplayVideo.class);
                intenToDisplayVideo.putExtra("videoUri", videoUrl.toString());
                startActivity(intenToDisplayVideo);
            }
        }
    }

还有我的其他DisplayVideo活动类

VideoView videoView = (VideoView) findViewById(R.id.videoview_display_video_actvity);
Bundle extras = getIntent().getExtras();
        Uri myUri=  Uri.parse(extras.getString("videoUri"));
        videoView.setVideoURI(myUri);

1

如果要使用标准的额外数据字段,则可以执行以下操作:

private Uri imageUri;
....
Intent intent = new Intent(this, GoogleActivity.class);
intent.putExtra(Intent.EXTRA_STREAM, imageUri.toString());
startActivity(intent);
this.finish();

Intent的文档说:

EXTRA_STREAM   added in API level 1 
String EXTRA_STREAM
A content: URI holding a stream of data associated with the Intent,
used with ACTION_SEND to supply the data being sent. 

Constant Value: "android.intent.extra.STREAM"

您不必使用内置的标准名称,但这可能是很好的做法,并且更可重用。查看开发人员文档以获取所有内置标准额外数据字段的列表。


0

Uri.parse(extras.getString("imageUri"))是导致一个错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Intent android.content.Intent.putExtra(java.lang.String, android.os.Parcelable)' on a null object reference 

因此,我更改为以下内容:

intent.putExtra("imageUri", imageUri)

Uri uri = (Uri) getIntent().get("imageUri");

这样就解决了问题。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.