Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

chamar activity ligar

Fiz a seguinte alteração na reescrita do método onMenuItemClick para quando for autorizado a permissão de ligação atribuir uma flag que posteriormente eu verifico se esta flag está setada como "true" é startada a activity para ligar:

itemLigar.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                boolean permitido = false;

                if (ActivityCompat.checkSelfPermission(ListaAlunosActivity.this, Manifest.permission.CALL_PHONE)
                        != PackageManager.PERMISSION_GRANTED){
                    ActivityCompat.requestPermissions(ListaAlunosActivity.this,
                            new String[]{Manifest.permission.CALL_PHONE}, 123);
                    permitido =  (ActivityCompat.checkSelfPermission(ListaAlunosActivity.this, Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED);
                } else {
                    permitido = true;
                }

                if (permitido){
                    Intent intentLigar = new Intent(Intent.ACTION_CALL);
                    intentLigar.setData(Uri.parse("tel:" + aluno.getTelefone()));
                    startActivity(intentLigar);
                }


                return false;
            }
        });

O código funciona apenas em modo DEBUG. Alguém saberia me dizer pq?

1 resposta
solução!

Olá Marcos,

Acho que entendi o resultado que você está tentando alcançar mas existe um detalhe ali no meio do código acaba complicando um pouco essa solução.

Vamos olhar esse trecho:

ActivityCompat.requestPermissions(ListaAlunosActivity.this,
                            new String[]{Manifest.permission.CALL_PHONE}, 123);
permitido =  (ActivityCompat.checkSelfPermission(ListaAlunosActivity.this, Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED);

Quando invocamos o método requestPermissions(...), esse método é executado de forma assíncrona. Isso significa que o código não fica parado nessa linha até o usuário responder se quer dar a permissão ou não. Isso significa que a linha seguinte do permitido = checkSelfPermission(...) vai ser executada imediatamente após a gente ter pedido as permissões e provavelmente permitido vai receber o valor false pois ainda não deu tempo do usuário responder.

Nesse caso, precisamos ser avisados pelo Android quando o usuário responder ao pedido de permissão. Podemos fazer isso sobrescrevendo um método da nossa Activity. O nome desse método é onRequestPermissionsResult e esse método será invocado logo após o usuário ter decidido fornecer ou não as permissões solicitadas.

Para usar esse método, primeiro você faz chamada para o requestPermissions passando as permissões a serem solicitadas e um código de identificação para essa solicitação.:

ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, 123);

Depois você sobrescreve o método onRequestPermissionsResult e verifica se o código da solicitação bate com o código que foi usado na solicitação das permissões. Se o código bater aí você verifica qual foi a decisão do usuário: permitido ou negado. Se tudo estiver certo, aí você executa o código para disparar a intent ou qualquer outra ação que queira realizar:

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == 123) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // aqui vem o código a ser executado depois de receber a permissão
            }
        }
    }