Як передати URI у намірі?


99

Я намагаюся передати URI-об’єкт моєму наміру, щоб використовувати цей URI в іншій діяльності ...

Як мені здати URI?

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

Як я зараз використовую цей URI у своїй іншій діяльності?

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

Дякую, хлопці



Відповіді:


178

ви можете зберігати uri як рядок

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

а потім просто перетворити рядок назад в такий як uri

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

2
гаразд ... круто ... але я не знаю, як зберігати урі як рядок :(
Роберт Ель

У наведеному вище коді його перетворюють на рядок. imageuri.toString () перетворює uri в рядок для вас.
Rufflez

1
@malclocke має краще рішення. Не потрібно вручну перетворювати на рядок і назад.
слюсар

Ви можете використовувати intent.setData (imageUri);
Buntupana

1
Якусь хвилину мені було цікаво, що означають "максимуми". Простіше кажучи: intent.putExtra("imageUrl", mImageUri.toString()); Іншою діяльністю String imageUrl = getIntent().getStringExtra("imageUrl"); Uri mImageUri = Uri.parse(imageUrl);
Брайан

136

В Uriреалізує клас Parcelable, так що ви можете додавати і витягувати його безпосередньо зIntent

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

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

Ви можете використовувати один і той же метод для будь-яких об'єктів, які реалізують Parcelable, а при необхідності можна реалізувати і Parcelableна власних об'єктах.


10
Підказка будь-кому в майбутньому: переконайтеся, що ви використовуєте, android.net.Uriа ні java.net.URI!
Калеб Ярес

4
Для подальшої довідки, якщо ви ставите кілька додаткових даних в об'єкт Bundle перед використанням intent.putExtras(bundle);, використовуйте bundle.putParcelable("imageUri", uri);замість того, щоб використовувати intent.putExtra(...);безпосередньо в Intentоб'єкті.
Армандо

Масиви теж працюють! i.putExtra("URIList", uriList.toArray());->List<Uri> myList = i.getParcelableArrayListExtra("URIList");
П'єр

отримав цю помилку під час розміщення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
Омар Бошра

52

У намірі можна безпосередньо поставити Урі. Вам не потрібно перетворювати Uri в рядок і знову конвертувати в Uri.

Подивіться на цей простий підхід.

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

І щоб повернути Урі від наміру:

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

1
Попередження: Вищенаведена відповідь / рішення не слід використовувати для локальних передач, оскільки, можливо, вони не отримають. Для місцевих трансляцій краще використовувати відповідь malclocke: stackoverflow.com/a/13981436/1617737 .
заборона-геоінженерія

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


І тоді ви можете отримати це так:

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

1

ось як я цим користуюся; Ця кнопка в моєму класі активності CameraActionActivity, де я дзвоню на камеру

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

І мій інший клас активності 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);

1

Якщо ви хочете використовувати стандартне поле додаткових даних, ви зробите щось подібне:

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

Документація для намірів говорить:

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"

Вам не доведеться використовувати вбудовані стандартні імена, але це, мабуть, хороша практика та багаторазове використання. Перегляньте документацію для розробників, щоб переглянути список усіх вбудованих стандартних додаткових полів даних.


0

Uri.parse(extras.getString("imageUri"))Викликало помилку:

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 

Тож я змінився на таке:

intent.putExtra("imageUri", imageUri)

і

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

Це вирішило проблему.


-2

ви можете зробити так. imageuri може бути перетворений у такий рядок.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.