🚀 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 doFileProvidercom URIscontent://é obrigatório para a Engenharia Premium.
TIP
Utilize
File.createTempFile()para gerar nomes únicos baseados em timestamp, evitando sobrepor fotos capturadas anteriormente.