Permissões em Tempo de Execução (Runtime Permissions)
Definição
Permissões em Tempo de Execução (Runtime Permissions) são permissões que um aplicativo solicita durante o uso, e não apenas no momento da instalação. Esse modelo foi adotado para que o usuário tenha mais controle sobre o acesso a recursos sensíveis do dispositivo, como câmera, localização, microfone, contatos, entre outros.
Desde o Android 6.0 (API 23) e iOS 10, esse comportamento se tornou padrão para proteger a privacidade dos usuários. Ao invés de conceder tudo na instalação, o sistema solicita permissões no momento em que o recurso é necessário.
Objetivos das Permissões em Tempo de Execução
- Reforçar a segurança e a privacidade: o usuário precisa autorizar explicitamente o acesso a dados e funcionalidades sensíveis.
- Evitar abusos por parte dos apps: impede que funcionalidades sejam acessadas sem justificativa ou consentimento.
- Permitir decisões contextuais: o app pode solicitar a permissão apenas quando ela for realmente necessária.
Exemplo prático (Java — Android)
Abaixo, um exemplo em Java que demonstra como solicitar permissão para acessar a câmera no Android:
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private static final int REQUEST_CAMERA_PERMISSION = 100;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
// Solicita a permissão em tempo de execução
ActivityCompat.requestPermissions(
this,
new String[]{Manifest.permission.CAMERA},
REQUEST_CAMERA_PERMISSION
);
} else {
acessarCamera();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CAMERA_PERMISSION) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
acessarCamera();
} else {
Toast.makeText(this, "Permissão negada para usar a câmera", Toast.LENGTH_SHORT).show();
}
}
}
private void acessarCamera() {
Toast.makeText(this, "Câmera acessada com sucesso", Toast.LENGTH_SHORT).show();
// Aqui você pode abrir a câmera ou iniciar a captura
}
}
O ciclo de solicitação de permissões
[App tenta acessar recurso sensível]
--> Verifica se a permissão já foi concedida
--> Se sim: executa normalmente
--> Se não: solicita permissão ao usuário
[Usuário responde]
--> Se aprovada: continua com a funcionalidade
--> Se negada: informa o usuário e trata o caso
Esse fluxo permite que o aplicativo reaja de forma segura e controlada às decisões do usuário.