terça-feira, 7 de fevereiro de 2017

Solicitar e Tratar Permissões para API 23 ou superior

A partir da API 23 (Android Marshmallow), o usuário tem o controle de aceitar individualmente as permissões que o aplicativo solicita. Portanto, além de colocar as uses-permission no manifest, é necessário solicitar todas as permissões individualmente ao usuário. Para isso, temos que criar um código parecido com o que está abaixo:

//Crie um array com as permissões necessárias
private String[] permissoesNecessarias = new String[] {
            android.Manifest.permission.SEND_SMS,
            android.Manifest.permission.INTERNET
};


//Crie uma classe para checar se as permissões foram aceitas
public class Permissao {

    public static boolean validaPermissoes(int requestCode, Activity activity, String[] permissoes) {

        if(Build.VERSION.SDK_INT >= 23) {
            List<String> listaPermissoes = new ArrayList<>();


            //Percorre as permissões passadas, verificando uma a uma se já tem a permissão liberada
            for (String permissao : permissoes) {
                Boolean validaPermissao = ContextCompat.checkSelfPermission(activity, permissao) == PackageManager.PERMISSION_GRANTED;
                if(!validaPermissao) listaPermissoes.add(permissao);
            }

            if(listaPermissoes.isEmpty()) return true;


            //Solicita permissão
            ActivityCompat.requestPermissions(activity, listaPermissoes.toArray(new String[0]), requestCode);
        }

        return true;
    }
}



//Gera AlertDialog para avisar que o Usuário só pode usar o App se aceitar as permissões
private void alertaValidacaoPermissao() {

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("Permissões negadas");
    builder.setMessage("Para utilizar este app, é necessário aceitar as permissões");

    builder.setPositiveButton("CONFIRMAR", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            finish();
        }
    });

    AlertDialog dialog = builder.create();
    dialog.show();
}

 
//Tratar Negação de Permissão
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResult) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResult);
    for(int resultado : grantResult) {
        if(resultado == PackageManager.PERMISSION_DENIED) {
            alertaValidacaoPermissao();
        }
    }
}

2 comentários: