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

Robert El
la source

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"));
Lukap
la source
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.

Malclocke
la source
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();
sablonneux
la source
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"));
silencieux
la source
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);
Sam
la source
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.

Tom Rutchik
la source
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.

Wrichik Basu
la source
-2

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

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

Saad Bilal
la source