¿Cómo obtener el uri de la foto capturada?

¿Qué quiero lograr? Quiero obtener el URI de la imagen capturada y guardarla en Firebase. ¿Qué probé? En primer lugar, necesitaba abrir la cámara. A continuación, cómo lo hice:

 Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    if (cameraIntent.resolveActivity(getActivity().getPackageManager()) != null)
        startActivityForResult(cameraIntent, CAMERA_REQUEST_CODE);

Después de capturar la imagen, necesitaba obtener el URI de la imagen. A continuación, cómo lo hice:

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

Entonces todo estuvo bien. Pero solo en algunos dispositivos. Supongo que solo funciona en el nivel API de más de 21 dispositivos. En otros dispositivos,getData() devuelve nulo

Entonces, ¿qué he hecho después? Descubrí que puedo obtener el mapa de bits de la imagen a través del siguiente código:

Bitmap bitmap = (Bitmap)data.getExtras().get("data") ; 

Entonces, tengo un mapa de bits de la imagen. Y necesitaba obtener el URI de esta imagen. A continuación, cómo lo hice:

public Uri getImageUri(Context inContext, Bitmap inImage) {
  String path = 
  Images.Media.insertImage(inContext.getContentResolver(), inImage, 
  "Title", null);
  return Uri.parse(path);
 } 

El código anterior me devuelve URI, pero la imagen tiene muy mala calidad.

Entonces, seguí buscando una solución. Y descubrí que la forma correcta es crear el archivo cuando inicio elCameraActivity y guarde la uri de ese archivo. YonActivityResult Traté de obtener esa uri. A continuación, cómo lo hice:

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

    }

Y mionActivityResult convirtió:

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

El concepto anterior requiere agregar algunas etiquetas en el manifiesto:

 <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>

Mi archivo xml es:

<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-files-path name="images"/>
</paths>

El método anterior no funcionó porquedata enonActivityReuslt fue nulo

Entonces, ¿qué necesito hacer para lograr mi objetivo?

Respuestas a la pregunta(2)

Su respuesta a la pregunta