Como passar um URI para uma intent?

99

Estou tentando passar um URI-Object para meu Intent para usar esse URI em outra atividade ...

Como faço para passar um URI?

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

Como faço para usar agora este URI em minha outra atividade?

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

Obrigado galera

Robert El
fonte

Respostas:

178

você pode armazenar o uri como string

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

e então converta a string de volta para uri assim

Uri myUri = Uri.parse(extras.getString("imageUri"));
Lukap
fonte
2
ok legal ... mas eu não sei como armazenar um uri como uma string :(
Robert El
No código acima, é convertido em uma string. imageuri.toString () está convertendo o uri em uma string para você.
Rufflez
1
@malclocke tem uma solução melhor. Não há necessidade de converter manualmente para string e vice-versa.
relojoeiro
Você pode usar intent.setData (imageUri);
Buntupana
1
Por um momento, fiquei me perguntando o que significava "extras". Em termos simples: intent.putExtra("imageUrl", mImageUri.toString()); Em outra atividade String imageUrl = getIntent().getStringExtra("imageUrl"); Uri mImageUri = Uri.parse(imageUrl);
Brian
136

A Uriclasse implementa Parcelable, então você pode adicionar e extrair diretamente doIntent

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

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

Você pode usar o mesmo método para qualquer objeto que implemente Parcelablee pode implementar Parcelableem seus próprios objetos, se necessário.

malclocke
fonte
10
Dica para qualquer pessoa no futuro: certifique-se de que está usando android.net.Urie não java.net.URI!
Caleb Jares
4
Para referência futura, se você estiver colocando vários extras em um objeto Bundle antes de usar intent.putExtras(bundle);, use em bundle.putParcelable("imageUri", uri);vez de usar intent.putExtra(...);diretamente no Intentobjeto.
Armando
Arrays também funciona! i.putExtra("URIList", uriList.toArray());->List<Uri> myList = i.getParcelableArrayListExtra("URIList");
Pierre
recebi este erro ao colocarjava.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

Em Intent, você pode colocar Uri diretamente. Você não precisa converter o Uri em string e convertê-lo novamente em Uri.

Veja esta abordagem simples.

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

E para obter o Uri de volta da intenção:

// Get Uri from Intent
Uri imageUri=getIntent().getData();
arenoso
fonte
1
Aviso: A resposta / solução acima não deve ser usada para transmissões locais, pois você pode descobrir que elas não serão recebidas. Para transmissões locais, é melhor usar a resposta do malclocke: stackoverflow.com/a/13981436/1617737 .
ban-geoengenharia de
1
private Uri imageUri;
....
Intent intent = new Intent(this, GoogleActivity.class);
intent.putExtra("imageUri", imageUri.toString());
startActivity(intent);
this.finish();


E então você pode buscá-lo assim:

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

aqui como eu uso; Este botão dentro da minha classe CameraActionActivity Activity onde chamo a câmera

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

E minha outra classe de atividade 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
fonte
1

Se quiser usar o campo de dados extra padrão, você faria algo assim:

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

A documentação do Intent diz:

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"

Você não precisa usar os nomes padrão integrados, mas é provavelmente uma boa prática e mais reutilizável. Dê uma olhada na documentação do desenvolvedor para obter uma lista de todos os campos de dados extras padrão integrados.

Tom Rutchik
fonte
0

O Uri.parse(extras.getString("imageUri"))estava causando um erro:

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 

Então mudei para o seguinte:

intent.putExtra("imageUri", imageUri)

e

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

Isso resolveu o problema.

Wrichik Basu
fonte
-2

você pode fazer assim. imageuri pode ser convertido em string assim.

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

Saad Bilal
fonte