1
resposta

Se demoro a dar permissão à localização o aparelho informa "contact as stopped". Como conceder permissão de localização na ListaAlunosActivity no evento do botão?

Pessoal, boa tarde.

Estou atribuindo a permissão de acesso à localização em minha MapaActivity.Java. Acontece que se demoro a conceder permissão o app crascha. Minha dúvida é bem semelhante a esta "https://cursos.alura.com.br/forum/topico-crash-ao-abrir-o-mapa-35273". Contudo, o tópico acima foi fechado sem que seja dado o exemplo de colocar esta permissão na ListaAlunos.Activity. Como fazer lá?

Seguem meus códigos para melhor contextualização:

MapaActivity.java

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);

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

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

    @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);
            }
        }
    }
}

MapaFragment.java

public class MapaFragment extends SupportMapFragment implements OnMapReadyCallback {
    private GoogleMap mapa;

    @Override
    public void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        getMapAsync(this); //Prepara uma instância do Google Maps para customização.
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        this.mapa = googleMap;
        LatLng posicao = obterCoordenadas("Rua São Paulo 2566, Centro, Belo Horizonte");

        if(posicao != null){
            centralizaEm(posicao);
        }

        AlunoDAO alunoDAO = new AlunoDAO(getContext()); //getContext() é chamado ao invés do "this" neste caso pois estamos em um fragment.

        for (Aluno aluno : alunoDAO.getAlunos()){

           LatLng coordenada = obterCoordenadas(aluno.getEndereco());

           if(coordenada != null){
               MarkerOptions marcador = new MarkerOptions().position(coordenada).title(aluno.getNome()).snippet(aluno.getEndereco());
               marcador.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_YELLOW));
               mapa.addMarker(marcador);
           }

        }
        alunoDAO.close();
        new Localizador(getContext(), this);

    }

    private LatLng obterCoordenadas(String endereco){

        try {
            Geocoder geocoder = new Geocoder(getContext());
            List<Address> resultados = geocoder.getFromLocationName(endereco, 1);

            if (!resultados.isEmpty()){
                LatLng coordenadas = new LatLng(resultados.get(0).getLatitude(), resultados.get(0).getLongitude());
                return coordenadas;
            }

        } catch (IOException e) {
            e.printStackTrace();
1 resposta

Não sou bom em Android mas tenta colocar dentro de um while. While não for dado permissão fica esperando. E dentro desse while um if pra caso a pessoa negar a permissão ele dizer que é necessário a permissão para continuar e então pedir denovo a permissão.