🚀 7.1 Captura Profissional de Imagens

Utilizar a câmera via Intent é a forma mais eficiente de integrar fotografia ao seu app sem a complexidade de gerenciar o hardware diretamente. No entanto, para segurança e compatibilidade com o Android moderno (API 24+), devemos abandonar o Uri.fromFile() em favor do FileProvider.

Configurando o FileProvider (Segurança Premium)

Para compartilhar o arquivo da foto com o aplicativo da Câmera, precisamos de um provedor de conteúdo seguro. No AndroidManifest.xml, adicione:

<provider
    android:name="androidx.core.content.FileProvider"
    android:authorities="${applicationId}.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths" />
</provider>

Crie o arquivo res/xml/file_paths.xml:

<paths>
    <external-path name="my_images" path="Android/data/${applicationId}/files/Pictures" />
</paths>

Captura com ActivityResultLauncher (Java 17)

Esqueça o startActivityForResult. No Android Studio 2023.1, utilizamos o ActivityResultLauncher para um código mais limpo e seguro:

private Uri uriFoto;
 
// 1. Registrando o lançador de captura
private final var takePictureLauncher = registerForActivityResult(
    new ActivityResultContracts.TakePicture(), sucess -> {
        if (sucess) {
            binding.imageViewFoto.setImageURI(uriFoto);
            Toast.makeText(this, "Foto salva!", Toast.LENGTH_SHORT).show();
        }
    });
 
// 2. Disparando a câmera
public void capturarFoto() {
    var fotoFile = criarArquivoFoto();
    if (fotoFile != null) {
        uriFoto = FileProvider.getUriForFile(this, 
                getApplicationContext().getPackageName() + ".fileprovider", 
                fotoFile);
        takePictureLauncher.launch(uriFoto);
    }
}

Adicionando à Galeria Pública

Após a captura, se desejar que a foto apareça na Galeria do usuário, utilize o MediaScanner:

private void adicionarGaleria(Uri uri) {
    var intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
    intent.setData(uri);
    sendBroadcast(intent);
}

CAUTION

FileUriExposedException: Se você tentar passar um file:// diretamente para a câmera no Android 7.0+, seu app irá travar imediatamente. O uso do FileProvider com URIs content:// é obrigatório para a Engenharia Premium.

TIP

Utilize File.createTempFile() para gerar nomes únicos baseados em timestamp, evitando sobrepor fotos capturadas anteriormente.


⬅️ Capítulo Anterior | Próximo Capítulo ➡️