Como obter uri da foto capturada?
O que eu quero alcançar? Quero obter o URI da imagem capturada e salvá-la no Firebase. O que eu tentei? Antes de tudo, eu precisava abrir a câmera. Abaixo como eu fiz isso:
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
if (cameraIntent.resolveActivity(getActivity().getPackageManager()) != null)
startActivityForResult(cameraIntent, CAMERA_REQUEST_CODE);
Depois de capturar a imagem, eu precisava obter o URI da imagem. Abaixo como eu fiz isso:
if (resultCode == Activity.RESULT_OK) {
if (requestCode == CAMERA_REQUEST_CODE) {
if (data != null) {
if (data.getData() != null) {
Uri capturedImageUri = data.getData();
} else {
Toast.makeText(getContext(), getString(R.string.coudldnt_get_photo), Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(getContext(), getString(R.string.coudldnt_get_photo), Toast.LENGTH_SHORT).show();
}
Então estava tudo bem. Mas apenas em alguns dispositivos. Suponho que ele funcione apenas no nível da API em mais de 21 dispositivos. Em outros dispositivos,getData()
retorna nulo.
Então, o que eu fiz a seguir? Descobri que posso obter o Bitmap da imagem através do seguinte código:
Bitmap bitmap = (Bitmap)data.getExtras().get("data") ;
Então, eu tenho um bitmap da imagem. E eu precisava obter o URI desta imagem. Abaixo como eu fiz isso:
public Uri getImageUri(Context inContext, Bitmap inImage) {
String path =
Images.Media.insertImage(inContext.getContentResolver(), inImage,
"Title", null);
return Uri.parse(path);
}
O código acima me retorna URI, mas a imagem tem uma qualidade muito ruim.
Então, eu continuei procurando uma solução. E descobri que o caminho certo é criar o arquivo quando inicio oCameraActivity
e salve a uri desse arquivo. EonActivityResult
Eu tentei pegar essa uri. Abaixo como eu fiz isso:
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (cameraIntent.resolveActivity(getActivity().getPackageManager()) != null) {
File photoFile = null;
try {
photoFile = createImageFile();
} catch (IOException ex) {
}
if (photoFile != null) {
Uri photoUri = FileProvider.getUriForFile(getContext(), "i_dont_know_what_to_write_here", photoFile);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
startActivityForResult(cameraIntent, CAMERA_REQUEST_CODE);
}
}
E meuonActivityResult
tornou-se:
if (resultCode == Activity.RESULT_OK) {
if (requestCode == CAMERA_REQUEST_CODE) {
if (data != null) {
Uri capturedPhotoUri =
data.getParcelableExtra(MediaStore.EXTRA_OUTPUT);
} else {
Toast.makeText(getContext(),
getString(R.string.coudldnt_get_photo), Toast.LENGTH_SHORT).show();
}
O conceito acima requer a adição de algumas tags no manifesto:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="i_dont_know_what_to_write_here"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/my_paths" />
</provider>
Meu arquivo xml é:
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-files-path name="images"/>
</paths>
O método acima não funcionou porquedata
emonActivityReuslt
foi nulo.
Então, o que eu preciso fazer para alcançar meu objetivo?