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

Robert El
quelle

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

Malclocke
quelle
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();
sandig
quelle
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"));
Silentw
quelle
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);
Sam
quelle
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.

Tom Rutchik
quelle
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.

Wrichik Basu
quelle
-2

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

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

Saad Bilal
quelle