Как передать URI намерению?

100

Я пытаюсь передать 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 ...

Спасибо вам, ребята

Роберт Эл
источник

Ответы:

179

вы можете сохранить uri как строку

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

а затем просто преобразуйте строку обратно в uri, как это

Uri myUri = Uri.parse(extras.getString("imageUri"));
Лукап
источник
2
хорошо, круто ... но я не знаю, как сохранить uri в виде строки :(
Роберт Эль
В приведенном выше коде он преобразован в строку. imageuri.toString () преобразует uri в строку для вас.
Rufflez
1
У @malclocke есть лучшее решение. Нет необходимости вручную преобразовывать в строку и обратно.
clocksmith 04
Вы можете использовать intent.setData (imageUri);
Buntupana 06
1
На мгновение мне стало интересно, что означают «дополнительные услуги». Проще говоря: intent.putExtra("imageUrl", mImageUri.toString()); В другой деятельности String imageUrl = getIntent().getStringExtra("imageUrl"); Uri mImageUri = Uri.parse(imageUrl);
Брайан
137

В 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объекте.
Armando
Массивы тоже работают! 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

В Intent вы можете напрямую поместить Uri. Вам не нужно преобразовывать 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 Activity, где я вызываю камеру

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

В документации для Intent говорится:

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

Саад Билал
источник