Bir URI bir amaca nasıl iletilir?


99

Bu URI'yi başka bir etkinlikte kullanmak için amacıma bir URI Nesnesi geçirmeye çalışıyorum ...

Bir URI'yi nasıl geçiririm?

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

Şimdi bu URI'yi diğer etkinliğimde nasıl kullanırım?

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

Sağolun beyler



Yanıtlar:


178

uri'yi dize olarak saklayabilirsiniz

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

ve sonra dizeyi bu şekilde tekrar uri'ye dönüştürün

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

2
tamam harika ... ama bir uri'yi dizge olarak nasıl saklayacağımı bilmiyorum :(
Robert El

Yukarıdaki kodda, bir dizeye dönüştürülmüştür. imageuri.toString (), uri'yi sizin için bir dizeye dönüştürüyor.
Rufflez

1
@malclocke'un daha iyi bir çözümü var. Manuel olarak dizeye ve geri dönüştürmeye gerek yok.
saatçi

İntent.setData (imageUri) kullanabilirsiniz;
Buntupana

1
Bir an "ekstraların" ne anlama geldiğini merak ettim. Basit bir ifadeyle: intent.putExtra("imageUrl", mImageUri.toString()); Başka bir etkinlikte String imageUrl = getIntent().getStringExtra("imageUrl"); Uri mImageUri = Uri.parse(imageUrl);
Brian

137

UriSınıfının uyguladığı Parcelable, bu yüzden ekleyebilir ve bunu doğrudan ayıklamakIntent

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

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

Uygulayan tüm nesneler için aynı yöntemi kullanabilir ve gerekirse kendi nesneleriniz üzerinde Parcelableuygulayabilirsiniz Parcelable.


10
Gelecekte kimseye İpucu: çalışmadığından emin olun ve kullandığınız android.net.Urideğil java.net.URI!
Caleb Jares

4
İleride başvurmak için intent.putExtras(bundle);, kullanmadan önce bir Bundle nesnesine birkaç ekstra koyuyorsanız , doğrudan nesnede kullanmak bundle.putParcelable("imageUri", uri);yerine kullanın . intent.putExtra(...);Intent
Armando

Diziler de işe yarıyor! i.putExtra("URIList", uriList.toArray());->List<Uri> myList = i.getParcelableArrayListExtra("URIList");
Pierre

koyarken bu hatayı aldımjava.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

Niyette, doğrudan Uri koyabilirsiniz. Uri'yi dizeye dönüştürmenize ve tekrar Uri'ye dönüştürmenize gerek yoktur.

Bu basit yaklaşıma bakın.

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

Ve Uri'yi niyetten geri almak için:

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

1
Uyarı: Yukarıdaki cevap / çözüm, alınamayacaklarını düşünebileceğiniz için yerel yayınlar için kullanılmamalıdır. Yerel yayınlar için malclocke'nin cevabını kullanmak daha iyidir: 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();


Ve sonra bunu şu şekilde getirebilirsiniz:

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

1

işte nasıl kullanıyorum; CameraActionActivity Activity sınıfımdaki bu düğme, kamera adını verdiğim yer

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

Ve diğer DisplayVideo Aktivite Sınıfım

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

Standart ekstra veri alanını kullanmak istiyorsanız, şöyle bir şey yaparsınız:

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

Niyet dokümantasyonu şunları söylüyor:

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"

Yerleşik standart isimleri kullanmak zorunda değilsiniz, ancak muhtemelen iyi bir uygulamadır ve daha fazla yeniden kullanılabilir. Tüm yerleşik standart ekstra veri alanlarının bir listesi için geliştirici belgelerine bir göz atın.


0

Uri.parse(extras.getString("imageUri"))Bir hataya neden oldu:

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 

Ben de şu şekilde değiştirdim:

intent.putExtra("imageUri", imageUri)

ve

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

Bu sorunu çözdü.


-2

bunu beğenebilirsin. imageuri bu şekilde dizeye dönüştürülebilir.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.