Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Mostrar a Activity depois de aceitar a permissão

Eu fiz a permissão local igual como tava no exemplo do exercício. Quando eu clico pra ir pro mapa, a permissão aparece, mas logo depois meu aplicativo crasha porque é preciso que a permissão esteja aceita. Como eu faço pra a activity espera que eu aceite a permissão?

6 respostas

Olá Vânia!

Provavelmente o que está acontecendo é que a tela de pedido de permissões deve estar sendo chamado e logo em seguida a Intent que dispara a Activity do mapa deve estar sendo iniciado. Isso só deve acontecer se o usuário já tiver as permissões necessárias.

Para verificarmos se o problema é esse mesmo, poste aqui o código da sua ListaAlunosActivity e também a Exception que aparece no seu console quando o erro acontece.

Jeferson, eu to olhando a permissão na activity do Mapa

Activity do Mapa

public class MapaActivity extends AppCompatActivity {

    private static final int REQUEST_PERMISSOES = 1;
    private MapaFragment mapaFragment;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mapa);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED
                    || ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                String[] permissoes = {android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION};
                requestPermissions(permissoes, REQUEST_PERMISSOES);
            }
        }

        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        mapaFragment = new MapaFragment();
        transaction.replace(R.id.frame_mapa, mapaFragment);
        transaction.commit();

    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == REQUEST_PERMISSOES) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED &&
                    grantResults[1] == PackageManager.PERMISSION_GRANTED) {
                new Localizador(this, mapaFragment);
            }
        }
    }
}

Aqui o método que eu eu chamo a activity

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){

            case R.id.menu_enviar_notas:
                new EnviaAlunosTask(this).execute();
                break;

            case R.id.menu_baixar_provas:
                Intent vaiPraProvas = new Intent(this, ProvasActivity.class);
                startActivity(vaiPraProvas);
                break;
            case R.id.menu_mapa:
                Intent vaiParaMapa = new Intent(this, MapaActivity.class);
                startActivity(vaiParaMapa);
                break;
        }

        return super.onOptionsItemSelected(item);

    }

A exception

--------- beginning of crash
11-08 01:07:05.888 22480-22480/com.vania.alura1agenda E/AndroidRuntime: FATAL EXCEPTION: main
                                                                        Process: com.vania.alura1agenda, PID: 22480
                                                                        java.lang.SecurityException: Client must have ACCESS_FINE_LOCATION permission to request PRIORITY_HIGH_ACCURACY locations.
                                                                            at android.os.Parcel.readException(Parcel.java:1599)
                                                                            at android.os.Parcel.readException(Parcel.java:1552)
                                                                            at com.google.android.gms.location.internal.zzi$zza$zza.zza(Unknown Source)
                                                                            at com.google.android.gms.location.internal.zzk.zza(Unknown Source)
                                                                            at com.google.android.gms.location.internal.zzl.zza(Unknown Source)
                                                                            at com.google.android.gms.location.internal.zzd$1.zza(Unknown Source)
                                                                            at com.google.android.gms.location.internal.zzd$1.zza(Unknown Source)
                                                                            at com.google.android.gms.internal.zzqo$zza.zzb(Unknown Source)
                                                                            at com.google.android.gms.internal.zzra.zzd(Unknown Source)
                                                                            at com.google.android.gms.internal.zzra.zzb(Unknown Source)
                                                                            at com.google.android.gms.internal.zzrf.zzb(Unknown Source)
                                                                            at com.google.android.gms.internal.zzrd.zzb(Unknown Source)
                                                                            at com.google.android.gms.location.internal.zzd.requestLocationUpdates(Unknown Source)
                                                                            at com.vania.alura_agenda.Localizador.onConnected(Localizador.java:41)
                                                                            at com.google.android.gms.common.internal.zzk.zzp(Unknown Source)
                                                                            at com.google.android.gms.internal.zzrd.zzn(Unknown Source)
                                                                            at com.google.android.gms.internal.zzrb.zzass(Unknown Source)
                                                                            at com.google.android.gms.internal.zzrb.onConnected(Unknown Source)
                                                                            at com.google.android.gms.internal.zzrf.onConnected(Unknown Source)
                                                                            at com.google.android.gms.internal.zzqr.onConnected(Unknown Source)
                                                                            at com.google.android.gms.common.internal.zzj$1.onConnected(Unknown Source)
                                                                            at com.google.android.gms.common.internal.zze$zzj.zzavj(Unknown Source)
                                                                            at com.google.android.gms.common.internal.zze$zza.zzc(Unknown Source)
                                                                            at com.google.android.gms.common.internal.zze$zza.zzv(Unknown Source)
                                                                            at com.google.android.gms.common.internal.zze$zze.zzavl(Unknown Source)
                                                                            at com.google.android.gms.common.internal.zze$zzd.handleMessage(Unknown Source)
                                                                            at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                            at android.os.Looper.loop(Looper.java:148)
                                                                            at android.app.ActivityThread.main(ActivityThread.java:5443)
                                                                            at java.lang.reflect.Method.invoke(Native Method)
                                                                            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
                                                                            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
11-08 01:07:05.938 22480-23170/com.vania.alura1agenda W/System: ClassLoader referenced unknown path: /d
solução!

Olá Vânia,

Vamos observar o método onCreate(...) da MapaActivity:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mapa);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED
                    || ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                String[] permissoes = {android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION};
                requestPermissions(permissoes, REQUEST_PERMISSOES);
            }
        }

        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        mapaFragment = new MapaFragment();
        transaction.replace(R.id.frame_mapa, mapaFragment);
        transaction.commit();

    }

Perceba que o if está verificando se o usuário tem ou não permissão para acessar as funcionalidades de GPS mas quando ele não tem, apenas fazemos o request e nada mais! Isso significa que vai aparecer o pop-up pedindo as permissões mas a MapaActivity vai continuar rodando normalmente até que ele precise das permissões, momento no qual o aplicativo vai quebrar.

O correto seria chamar o método finish() quando o usuário não tem alguma das permissões e no else do if criar o MapaFragment pois somente nesse caso podemos iniciar a tela com o mapa e as funcionalidades de geolocalização.

Ok, entendi.

Como eu faria pra logo após eu garantir a permissão eu ir direto pra tela e não precisar apertar no botão novamente?

Olá Vânia,

Nesse caso você faria a troca dos Fragments ou chamada para outra Activity no método onRequestPermissionsResult(...) se as permissões foram dadas pelo usuário.