Comment passer un URI à un intent?


99

J'essaie de passer un objet URI à mon intention afin d'utiliser cet URI dans une autre activité ...

Comment passer un URI?

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

Comment utiliser maintenant cet URI dans mon autre activité?

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

Merci les gars



Réponses:


178

vous pouvez stocker l'URI sous forme de chaîne

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

puis convertissez simplement la chaîne en uri comme ceci

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

2
ok cool ... mais je ne sais pas comment stocker un uri sous forme de chaîne :(
Robert El

Dans le code ci-dessus, il est converti en chaîne. imageuri.toString () convertit l'URI en chaîne pour vous.
Rufflez

1
@malclocke a une meilleure solution. Pas besoin de convertir manuellement en chaîne et inversement.
horloger

Vous pouvez utiliser intent.setData (imageUri);
Buntupana

1
Pendant un moment, je me suis demandé ce que signifiait «extras». En termes simples: intent.putExtra("imageUrl", mImageUri.toString()); Dans une autre activité String imageUrl = getIntent().getStringExtra("imageUrl"); Uri mImageUri = Uri.parse(imageUrl);
Brian

136

La Uriclasse implémente Parcelable, vous pouvez donc l'ajouter et l'extraire directement à partir duIntent

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

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

Vous pouvez utiliser la même méthode pour tous les objets qui implémentent Parcelable, et vous pouvez implémenter Parcelablesur vos propres objets si nécessaire.


10
Conseil à quiconque à l'avenir: assurez-vous que vous utilisez android.net.Uriet non java.net.URI!
Caleb Jares

4
Pour référence future, si vous placez plusieurs extras dans un objet Bundle avant de l'utiliser intent.putExtras(bundle);, utilisez bundle.putParcelable("imageUri", uri);plutôt que d'utiliser intent.putExtra(...);directement dans l' Intentobjet.
Armando

Les tableaux fonctionnent aussi! i.putExtra("URIList", uriList.toArray());->List<Uri> myList = i.getParcelableArrayListExtra("URIList");
Pierre

obtenu cette erreur lors de la misejava.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

Dans Intent, vous pouvez directement mettre Uri. Vous n'avez pas besoin de convertir l'URI en chaîne et de le reconvertir en Uri.

Regardez cette approche simple.

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

Et pour récupérer Uri de l'intention:

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

1
Avertissement: La réponse / solution ci-dessus ne doit pas être utilisée pour les diffusions locales car vous pourriez constater qu'elles ne seront pas reçues. Pour les diffusions locales, il est préférable d'utiliser la réponse de 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();


Et puis vous pouvez le récupérer comme ceci:

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

1

voici comment je l'utilise; Ce bouton dans ma classe d'activité CameraActionActivity où j'appelle la caméra

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

Et mon autre cours d' activité 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

Si vous souhaitez utiliser un champ de données supplémentaires standard, vous feriez quelque chose comme ceci:

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

La documentation pour Intent dit:

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"

Vous n'êtes pas obligé d'utiliser les noms standard intégrés, mais c'est probablement une bonne pratique et plus réutilisable. Consultez la documentation du développeur pour obtenir une liste de tous les champs de données supplémentaires standard intégrés.


0

Le Uri.parse(extras.getString("imageUri"))provoquait une erreur:

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 

J'ai donc changé comme suit:

intent.putExtra("imageUri", imageUri)

et

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

Cela a résolu le problème.


-2

vous pouvez faire comme ça. imageuri peut être converti en chaîne de cette manière.

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.