Bagaimana cara meneruskan URI ke maksud?

99

Saya mencoba meneruskan Objek URI ke Maksud saya untuk menggunakan URI itu di aktivitas lain ...

Bagaimana cara saya lulus URI?

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

Bagaimana cara saya menggunakan URI ini sekarang dalam aktivitas saya yang lain?

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

Terima kasih kawan

Robert El
sumber

Jawaban:

178

Anda bisa menyimpan uri sebagai string

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

dan kemudian ubah string kembali menjadi uri seperti ini

Uri myUri = Uri.parse(extras.getString("imageUri"));
Lukap
sumber
2
ok keren ... tapi saya tidak tahu cara menyimpan uri sebagai string :(
Robert El
Dalam kode di atas, itu diubah menjadi string. imageuri.toString () mengubah uri menjadi string untuk Anda.
Rufflez
1
@malclocke memiliki solusi yang lebih baik. Tidak perlu mengonversi secara manual ke string dan kembali.
tukang jam
Anda bisa menggunakan intent.setData (imageUri);
Buntupana
1
Sejenak aku bertanya-tanya apa artinya "ekstra". Sederhananya: intent.putExtra("imageUrl", mImageUri.toString()); Dalam aktivitas lain String imageUrl = getIntent().getStringExtra("imageUrl"); Uri mImageUri = Uri.parse(imageUrl);
Brian
136

The Urimengimplementasikan kelas Parcelable, sehingga Anda dapat menambahkan dan ekstrak langsung dariIntent

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

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

Anda bisa menggunakan metode yang sama untuk setiap objek yang diimplementasikan Parcelable, dan Anda bisa mengimplementasikan Parcelablepada objek Anda sendiri jika diperlukan.

malclocke
sumber
10
Petunjuk untuk siapa pun di masa mendatang: Pastikan Anda menggunakan android.net.Uridan tidak java.net.URI!
Caleb Jares
4
Untuk referensi di masa mendatang, jika Anda meletakkan beberapa tambahan dalam objek Bundle sebelum menggunakan intent.putExtras(bundle);, gunakan bundle.putParcelable("imageUri", uri);alih-alih menggunakan intent.putExtra(...);langsung di Intentobjek.
Armando
Array juga berfungsi! i.putExtra("URIList", uriList.toArray());->List<Uri> myList = i.getParcelableArrayListExtra("URIList");
Pierre
mendapat kesalahan ini saat meletakkanjava.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

Di Intent, Anda bisa langsung meletakkan Uri. Anda tidak perlu mengubah Uri menjadi string dan mengubahnya kembali menjadi Uri.

Lihat pendekatan sederhana ini.

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

Dan untuk mendapatkan Uri kembali dari niat:

// Get Uri from Intent
Uri imageUri=getIntent().getData();
berpasir
sumber
1
Peringatan: Jawaban / solusi di atas tidak boleh digunakan untuk siaran lokal karena Anda mungkin merasa tidak akan diterima. Untuk siaran lokal, lebih baik menggunakan jawaban malclocke: 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();


Dan kemudian Anda dapat mengambilnya seperti ini:

imageUri = Uri.parse(extras.getString("imageUri"));
silentw
sumber
1

di sini bagaimana saya menggunakannya; Tombol ini di dalam kelas Aktivitas CameraActionActivity tempat saya memanggil kamera

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

Dan Kelas Aktivitas DisplayVideo saya yang lain

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
sumber
1

Jika Anda ingin menggunakan bidang data tambahan standar, Anda akan melakukan sesuatu seperti ini:

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

Dokumentasi untuk Intent mengatakan:

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"

Anda tidak harus menggunakan nama standar bawaan, tetapi ini mungkin praktik yang baik dan lebih dapat digunakan kembali. Lihat dokumentasi pengembang untuk daftar semua bidang data tambahan standar bawaan.

Tom Rutchik
sumber
0

Itu Uri.parse(extras.getString("imageUri"))menyebabkan kesalahan:

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 

Jadi saya berubah menjadi yang berikut:

intent.putExtra("imageUri", imageUri)

dan

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

Ini memecahkan masalah.

Wrichik Basu
sumber
-2

kamu bisa melakukan seperti ini. imageuri dapat diubah menjadi string seperti ini.

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

Saad Bilal
sumber