Wie übergebe ich eine URI an eine Absicht?


98

Ich versuche, ein URI-Objekt an meine Absicht zu übergeben, um diesen URI in einer anderen Aktivität zu verwenden ...

Wie übergebe ich eine URI?

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

Wie verwende ich diesen URI jetzt in meiner anderen Aktivität?

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

Danke Jungs



Antworten:


178

Sie können den Uri als String speichern

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

und dann konvertiere einfach den String zurück in uri wie folgt

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

2
ok cool ... aber ich weiß nicht, wie man einen Uri als String speichert :(
Robert El

Im obigen Code wird es in eine Zeichenfolge konvertiert. imageuri.toString () konvertiert den Uri für Sie in einen String.
Rufflez

1
@malclocke hat eine bessere Lösung. Sie müssen nicht manuell in Zeichenfolge und zurück konvertieren.
Uhrmacher

Sie könnten intent.setData (imageUri) verwenden.
Buntupana

1
Für einen Moment fragte ich mich, was "Extras" bedeuteten. In einfachen Worten: intent.putExtra("imageUrl", mImageUri.toString()); In anderen Aktivitäten String imageUrl = getIntent().getStringExtra("imageUrl"); Uri mImageUri = Uri.parse(imageUrl);
Brian

135

Die UriKlasse wird implementiert Parcelable, sodass Sie sie direkt aus der hinzufügen und extrahieren könnenIntent

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

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

Sie können dieselbe Methode für alle zu implementierenden Objekte verwenden und bei Bedarf auch für Ihre eigenen Objekte Parcelableimplementieren Parcelable.


10
Hinweis für alle in der Zukunft: Stellen Sie sicher, dass Sie verwenden android.net.Uriund nicht java.net.URI!
Caleb Jares

4
Wenn Sie vor der Verwendung mehrere Extras in ein Bundle-Objekt einfügen intent.putExtras(bundle);, verwenden Sie diese Option, bundle.putParcelable("imageUri", uri);anstatt sie intent.putExtra(...);direkt im IntentObjekt zu verwenden.
Armando

Arrays funktionieren auch! i.putExtra("URIList", uriList.toArray());->List<Uri> myList = i.getParcelableArrayListExtra("URIList");
Pierre

habe diesen Fehler beim Putten bekommenjava.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 können Sie Uri direkt einfügen. Sie müssen den Uri nicht in einen String konvertieren und erneut in Uri konvertieren.

Schauen Sie sich diesen einfachen Ansatz an.

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

Und um Uri von seiner Absicht zurückzubekommen:

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

1
Warnung: Die obige Antwort / Lösung sollte nicht für lokale Sendungen verwendet werden, da diese möglicherweise nicht empfangen werden. Für lokale Sendungen ist es besser, die Antwort von malclocke zu verwenden: 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();


Und dann können Sie es so holen:

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

1

hier, wie ich es benutze; Diese Schaltfläche in meiner CameraActionActivity- Aktivitätsklasse, in der ich die Kamera aufrufe

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

Und meine andere DisplayVideo- Aktivitätsklasse

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

Wenn Sie ein zusätzliches Standarddatenfeld verwenden möchten, gehen Sie folgendermaßen vor:

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

Die Dokumentation zu Intent lautet:

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"

Sie müssen die integrierten Standardnamen nicht verwenden, aber es ist wahrscheinlich eine gute Praxis und wiederverwendbarer. In der Entwicklerdokumentation finden Sie eine Liste aller integrierten zusätzlichen Standarddatenfelder.


0

Das Uri.parse(extras.getString("imageUri"))verursachte einen Fehler:

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 

Also habe ich folgendes geändert:

intent.putExtra("imageUri", imageUri)

und

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

Dies löste das Problem.


-2

Sie können so tun. imageuri kann so in einen String umgewandelt werden.

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.