How to pass a URI to an intent?

I'm trying to pass a URI-Object to my Intent in order to use that URI in another activity.

How do I pass a URI?

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

How do I use now this URI in my other activity?

 imageUri = extras.getString("imageUri"); // I know thats wrong ...
119998 次浏览

可以将 uri 存储为字符串

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

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

Uri myUri = Uri.parse(extras.getString("imageUri"));
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"));

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

在意图中,可以直接将 Uri。您不需要将 Uri 转换为 string 并再次转换回 Uri。

看看这个简单的方法。

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

为了把尤里从阴谋中解救出来:

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

你可以这样做。 image 可以像这样转换成字符串。

PutUltra (“ imageUri”,imageUri.toString ()) ;

以下是我如何使用它; 这个按钮在我的 摄影行动活动类中,我调用相机

 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);
}
}
}

还有我的另一个 显示视频活动课

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

如果你想使用标准的额外数据字段,你可以这样做:

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

意图的文档显示:

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"

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

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");

这解决了问题。