¿Cómo pasar un URI a una intención?

99

Estoy tratando de pasar un URI-Object a mi Intent para usar ese URI en otra actividad ...

¿Cómo paso un URI?

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

¿Cómo uso ahora este URI en mi otra actividad?

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

Gracias chicos

Robert El
fuente

Respuestas:

178

puedes almacenar el uri como cadena

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

y luego simplemente convierte la cadena de nuevo a uri así

Uri myUri = Uri.parse(extras.getString("imageUri"));
Lukap
fuente
2
ok genial ... pero no sé cómo almacenar un uri como una cadena :(
Robert El
En el código anterior, se convierte en una cadena. imageuri.toString () está convirtiendo el uri en una cadena por usted.
Rufflez
1
@malclocke tiene una mejor solución. No es necesario convertir manualmente a cadena y viceversa.
relojero
Podría usar intent.setData (imageUri);
Buntupana
1
Por un momento me pregunté qué significaban "extras". En términos simples: intent.putExtra("imageUrl", mImageUri.toString()); en otra actividad String imageUrl = getIntent().getStringExtra("imageUrl"); Uri mImageUri = Uri.parse(imageUrl);
Brian
136

La Uriclase se implementa Parcelable, por lo que puede agregarla y extraerla directamente de laIntent

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

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

Puede utilizar el mismo método para cualquier objeto que se implemente Parcelable, y puede implementarlo Parcelableen sus propios objetos si es necesario.

malclocke
fuente
10
Sugerencia para cualquiera en el futuro: ¡asegúrese de que está usando android.net.Uriy no java.net.URI!
Caleb Jares
4
Para referencia futura, si está poniendo varios extras en un objeto Bundle antes de usarlo intent.putExtras(bundle);, utilícelo en bundle.putParcelable("imageUri", uri);lugar de usarlo intent.putExtra(...);directamente en el Intentobjeto.
Armando
¡Las matrices también funcionan! i.putExtra("URIList", uriList.toArray());->List<Uri> myList = i.getParcelableArrayListExtra("URIList");
Pierre
obtuve este error al ponerjava.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

En Intent, puedes poner directamente Uri. No es necesario convertir el Uri en una cadena y volver a convertirlo a Uri.

Mira este sencillo enfoque.

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

Y para recuperar a Uri de la intención:

// Get Uri from Intent
Uri imageUri=getIntent().getData();
arenoso
fuente
1
Advertencia: la respuesta / solución anterior no debe usarse para transmisiones locales, ya que es posible que no se reciban. Para transmisiones locales, es mejor usar la respuesta de 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();


Y luego puedes buscarlo así:

imageUri = Uri.parse(extras.getString("imageUri"));
silencioso
fuente
1

aquí como lo uso; Este botón dentro de mi clase de actividad CameraActionActivity donde llamo cámara

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

Y mi otra clase de actividad 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
fuente
1

Si desea utilizar un campo de datos adicional estándar, debe hacer algo como esto:

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

La documentación de Intent dice:

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"

No tiene que usar los nombres estándar integrados, pero probablemente sea una buena práctica y más reutilizable. Consulte la documentación del desarrollador para obtener una lista de todos los campos de datos adicionales estándar integrados.

Tom Rutchik
fuente
0

El Uri.parse(extras.getString("imageUri"))estaba causando un error:

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 

Entonces cambié a lo siguiente:

intent.putExtra("imageUri", imageUri)

y

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

Esto resolvió el problema.

Wrichik Basu
fuente
-2

puedes hacer así. imageuri se puede convertir en una cadena como esta.

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

Saad Bilal
fuente