How to pass a URI to an intent?
Asked Answered
E

9

124

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 ...
Elenaelenchus answered 5/11, 2011 at 0:57 Comment(2)
possible duplicate of How to get extra data from intent in android?Dees
possible duplicate of How to send an object from one Android Activity to another using Intents?Anchie
I
210

you can store the uri as string

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

and then just convert the string back to uri like this

Uri myUri = Uri.parse(extras.getString("imageUri"));
Instead answered 5/11, 2011 at 1:8 Comment(6)
ok cool ... but I don't know how to store a uri as a string :(Elenaelenchus
In the code above, its converted to a string. imageuri.toString() is converting the uri to a string for you.Murrah
@malclocke has a better solution. No need to manually convert to string and back.Passifloraceous
You could use intent.setData(imageUri);Definiens
For a moment I was wondering what "extras" meant. In simple terms: intent.putExtra("imageUrl", mImageUri.toString()); In other activity String imageUrl = getIntent().getStringExtra("imageUrl"); Uri mImageUri = Uri.parse(imageUrl);Varrian
Now you can try Kotlin way.Stevens
U
152

The Uri class implements Parcelable, so you can add and extract it directly from the Intent

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

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

You can use the same method for any objects that implement Parcelable, and you can implement Parcelable on your own objects if required.

Udometer answered 20/12, 2012 at 22:16 Comment(4)
Hint to anyone in the future: Make sure you're using android.net.Uri and not java.net.URI!Hadhramaut
For future reference, if you're putting several extras in a Bundle object before using intent.putExtras(bundle);, use bundle.putParcelable("imageUri", uri); instead of using intent.putExtra(...); directly in the Intent object.Actinometer
Arrays works too! i.putExtra("URIList", uriList.toArray()); -> List<Uri> myList = i.getParcelableArrayListExtra("URIList");Pantagruel
got this error when putting 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 referencePenurious
S
66

In Intent, you can directly put Uri. You don't need to convert the Uri to string and convert back again to Uri.

Look at this simple approach.

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

And to get Uri back from intent:

// Get Uri from Intent
Uri imageUri=getIntent().getData();
Semitic answered 29/11, 2013 at 11:4 Comment(1)
Warning: The above answer/solution should not be used for local broadcasts as you may find they won't get received. For local broadcasts, it's better to use malclocke's answer: https://mcmap.net/q/179874/-how-to-pass-a-uri-to-an-intent .Gorges
J
1
private Uri imageUri;
....
Intent intent = new Intent(this, GoogleActivity.class);
intent.putExtra("imageUri", imageUri.toString());
startActivity(intent);
this.finish();


And then you can fetch it like this:

imageUri = Uri.parse(extras.getString("imageUri"));
Julietjulieta answered 5/6, 2012 at 17:1 Comment(0)
V
1

here how I use it; This button inside my CameraActionActivity Activity class where I call 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);
            }
        }
    }

And my other DisplayVideo Activity Class

VideoView videoView = (VideoView) findViewById(R.id.videoview_display_video_actvity);
Bundle extras = getIntent().getExtras();
        Uri myUri=  Uri.parse(extras.getString("videoUri"));
        videoView.setVideoURI(myUri);
Vaudevillian answered 29/7, 2016 at 12:54 Comment(0)
B
1

If you want to use standard extra data field, you would do something like this:

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

The documentation for Intent says:

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"

You don't have to use the built-in standard names, but it's probably good practice and more reusable. Take a look at the developer documentation for a list of all the built-in standard extra data fields.

Buchalter answered 28/4, 2018 at 1:4 Comment(0)
D
0

The Uri.parse(extras.getString("imageUri")) was causing an error:

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 

So I changed to the following:

intent.putExtra("imageUri", imageUri)

and

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

This solved the problem.

Dear answered 28/3, 2020 at 16:26 Comment(0)
S
0

: Kotlin way:

Sender Activity:

val mIntent = Intent(mContext, YourDestinationActivity::class.java)
mIntent.putExtra("key_pass_uri", mImageUri.toString())
startActivity(mIntent)

Receiver Activity:

val mImageUri = Uri.parse(intent.getStringExtra("key_pass_uri"))
Stevens answered 3/1, 2024 at 9:40 Comment(0)
M
-3

you can do like this. imageuri can be converted into string like this.

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

Merc answered 1/1, 2014 at 8:20 Comment(0)

© 2022 - 2025 — McMap. All rights reserved.