Come passare un URI a un intento?


99

Sto cercando di passare un oggetto URI al mio intento per utilizzare quell'URI in un'altra attività ...

Come si passa un URI?

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

Come posso utilizzare ora questo URI nella mia altra attività?

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

Grazie ragazzi



Risposte:


178

puoi memorizzare l'uri come stringa

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

e quindi converti nuovamente la stringa in uri in questo modo

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

2
ok fantastico ... ma non so come memorizzare un uri come stringa :(
Robert El

Nel codice sopra, viene convertito in una stringa. imageuri.toString () sta convertendo l'uri in una stringa per te.
Rufflez

1
@malclocke ha una soluzione migliore. Non è necessario convertire manualmente in stringa e viceversa.
orologiaio

Potresti usare intent.setData (imageUri);
Buntupana

1
Per un momento mi sono chiesto cosa significasse "extra". In termini semplici: intent.putExtra("imageUrl", mImageUri.toString()); In altre attività String imageUrl = getIntent().getStringExtra("imageUrl"); Uri mImageUri = Uri.parse(imageUrl);
Brian il

136

La Uriclasse implementa Parcelable, quindi puoi aggiungerlo ed estrarlo direttamente dal fileIntent

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

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

È possibile utilizzare lo stesso metodo per tutti gli oggetti che implementano Parcelablee, Parcelablese necessario , è possibile implementarli sui propri oggetti.


10
Suggerimento per chiunque in futuro: assicurati di utilizzare android.net.Urie non java.net.URI!
Caleb Jares

4
Per riferimento futuro, se stai inserendo diversi extra in un oggetto Bundle prima dell'uso intent.putExtras(bundle);, usa bundle.putParcelable("imageUri", uri);invece di usare intent.putExtra(...);direttamente Intentnell'oggetto.
Armando

Anche gli array funzionano! i.putExtra("URIList", uriList.toArray());->List<Uri> myList = i.getParcelableArrayListExtra("URIList");
Pierre

ha ricevuto questo errore durante la messajava.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

In Intent, puoi inserire direttamente Uri. Non è necessario convertire l'URI in stringa e riconvertirlo nuovamente in Uri.

Guarda questo semplice approccio.

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

E per riportare Uri dall'intento:

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

1
Avviso: la risposta / soluzione sopra non deve essere utilizzata per le trasmissioni locali poiché potresti scoprire che non verranno ricevute. Nel caso di trasmissioni locali, è meglio l'uso di malclocke risposta: 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();


E poi puoi recuperarlo in questo modo:

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

1

ecco come lo uso; Questo pulsante all'interno della mia classe di attività CameraActionActivity in cui chiamo 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);
            }
        }
    }

E l'altro mio corso di attività 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

Se desideri utilizzare un campo dati extra standard, dovresti fare qualcosa del genere:

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

La documentazione per Intent dice:

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"

Non è necessario utilizzare i nomi standard incorporati, ma probabilmente è una buona pratica e più riutilizzabile. Dai un'occhiata alla documentazione per sviluppatori per un elenco di tutti i campi dati aggiuntivi standard incorporati.


0

La Uri.parse(extras.getString("imageUri"))stava causando un errore:

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 

Quindi sono passato al seguente:

intent.putExtra("imageUri", imageUri)

e

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

Questo ha risolto il problema.


-2

puoi fare così. imageuri può essere convertito in una stringa come questa.

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.