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?

questionAnswers(2)

yourAnswerToTheQuestion