Jak przekazać URI do intencji?

99

Próbuję przekazać obiekt URI do mojej intencji, aby użyć tego identyfikatora URI w innym działaniu ...

Jak przekazać identyfikator URI?

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

Jak mogę teraz użyć tego identyfikatora URI w mojej innej działalności?

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

Dzięki chłopaki

Robert El
źródło

Odpowiedzi:

178

możesz zapisać uri jako ciąg

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

a następnie po prostu przekonwertuj ciąg z powrotem na uri w ten sposób

Uri myUri = Uri.parse(extras.getString("imageUri"));
Lukap
źródło
2
ok fajnie ... ale nie wiem, jak przechowywać uri jako ciąg znaków :(
Robert El
W powyższym kodzie jest konwertowany na ciąg. imageuri.toString () konwertuje uri na ciąg znaków.
Rufflez
1
@malclocke ma lepsze rozwiązanie. Nie ma potrzeby ręcznej konwersji na ciąg iz powrotem.
zegarmistrz
Możesz użyć intent.setData (imageUri);
Buntupana
1
Przez chwilę zastanawiałem się, co oznaczają „dodatki”. Mówiąc prosto: w intent.putExtra("imageUrl", mImageUri.toString()); innej działalności String imageUrl = getIntent().getStringExtra("imageUrl"); Uri mImageUri = Uri.parse(imageUrl);
Brian
136

Te Urinarzędzia klasy Parcelable, dzięki czemu można dodawać i wyodrębnić go bezpośrednio zIntent

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

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

Możesz użyć tej samej metody dla dowolnych obiektów, które implementują Parcelable, i możesz zaimplementować Parcelablena własnych obiektach, jeśli jest to wymagane.

malclocke
źródło
10
Wskazówka dla każdego w przyszłości: upewnij się, że używasz, android.net.Uria nie java.net.URI!
Caleb Jares
4
Na przyszłość, jeśli umieszczasz kilka dodatków w obiekcie Bundle przed użyciem intent.putExtras(bundle);, użyj bundle.putParcelable("imageUri", uri);zamiast używać intent.putExtra(...);bezpośrednio w Intentobiekcie.
Armando
Tablice też działają! i.putExtra("URIList", uriList.toArray());->List<Uri> myList = i.getParcelableArrayListExtra("URIList");
Pierre,
dostałem ten błąd podczas umieszczaniajava.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

W Intencie możesz bezpośrednio umieścić Uri. Nie musisz konwertować Uri na ciąg i ponownie konwertować na Uri.

Spójrz na to proste podejście.

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

Aby odzyskać Uri z intencji:

// Get Uri from Intent
Uri imageUri=getIntent().getData();
piaszczysty
źródło
1
Ostrzeżenie: powyższej odpowiedzi / rozwiązania nie należy używać w przypadku transmisji lokalnych, ponieważ może się okazać, że nie zostaną one odebrane. W przypadku transmisji lokalnych lepiej jest użyć odpowiedzi malclocke: stackoverflow.com/a/13981436/1617737 .
zakaz geoinżynierii
1
private Uri imageUri;
....
Intent intent = new Intent(this, GoogleActivity.class);
intent.putExtra("imageUri", imageUri.toString());
startActivity(intent);
this.finish();


A potem możesz pobrać to w ten sposób:

imageUri = Uri.parse(extras.getString("imageUri"));
silentw
źródło
1

tutaj, jak go używam; Ten przycisk w mojej klasie aktywności CameraActionActivity, w której dzwonię do kamery

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

I moja inna klasa aktywności 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
źródło
1

Jeśli chcesz użyć standardowego dodatkowego pola danych, możesz zrobić coś takiego:

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

Dokumentacja dla Intent mówi:

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"

Nie musisz używać wbudowanych standardowych nazw, ale prawdopodobnie jest to dobra praktyka i jest bardziej przydatna do ponownego użycia. Zapoznaj się z dokumentacją programisty, aby uzyskać listę wszystkich wbudowanych standardowych dodatkowych pól danych.

Tom Rutchik
źródło
0

Uri.parse(extras.getString("imageUri"))Było przyczyną błędu:

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 

Więc zmieniłem na następujące:

intent.putExtra("imageUri", imageUri)

i

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

To rozwiązało problem.

Wrichik Basu
źródło
-2

możesz to zrobić. imageuri można przekształcić w ciąg w ten sposób.

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

Saad Bilal
źródło