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

Erro LocationServices

Como posso corrigir esse erro:

D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: br.com.cadastroDeAluno, PID: 15217
                  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.zzpr$zza.zzb(Unknown Source)
                      at com.google.android.gms.internal.zzqa.zzf(Unknown Source)
                      at com.google.android.gms.internal.zzqa.zzd(Unknown Source)
                      at com.google.android.gms.internal.zzqf.zzd(Unknown Source)
                      at com.google.android.gms.internal.zzqd.zzd(Unknown Source)
                      at com.google.android.gms.location.internal.zzd.requestLocationUpdates(Unknown Source)
                      at br.com.cadastroDeAluno.mapa.Localizador.onConnected(Localizador.java:43)
                      at com.google.android.gms.common.internal.zzl.zzo(Unknown Source)
                      at com.google.android.gms.internal.zzqd.zzm(Unknown Source)
                      at com.google.android.gms.internal.zzqb.zzapm(Unknown Source)
                      at com.google.android.gms.internal.zzqb.onConnected(Unknown Source)
                      at com.google.android.gms.internal.zzqf.onConnected(Unknown Source)
                      at com.google.android.gms.internal.zzpu.onConnected(Unknown Source)
                      at com.google.android.gms.common.internal.zzk$1.onConnected(Unknown Source)
                      at com.google.android.gms.common.internal.zzd$zzj.zzarz(Unknown Source)
                      at com.google.android.gms.common.internal.zzd$zza.zzc(Unknown Source)
                      at com.google.android.gms.common.internal.zzd$zza.zzx(Unknown Source)
                      at com.google.android.gms.common.internal.zzd$zze.zzasb(Unknown Source)
                      at com.google.android.gms.common.internal.zzd$zzd.handleMessage(Unknown Source)
                      at android.os.Handler.dispatchMessage(Handler.java:111)
                      at android.os.Looper.loop(Looper.java:207)
                      at android.app.ActivityThread.main(ActivityThread.java:5776)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)
D/NativeCrypto: ssl=0x7f71121b00 sslRead buf=0x7f8815e000 len=2048,timeo=2500
W/DynamiteModule: Local module descriptor class for com.google.android.gms.googlecertificates not found.
I/DynamiteModule: Considering local module com.google.android.gms.googlecertificates:0 and remote module com.google.android.gms.googlecertificates:2
I/DynamiteModule: Selected remote version of com.google.android.gms.googlecertificates, version >= 2
D/GoogleCertificates: com.google.android.gms.googlecertificates module is loaded
D/GoogleCertificatesImpl: Fetched 190 Google release certificates
D/GoogleCertificatesImpl: Fetched 363 Google certificates

Classe:

package br.com.cadastroDeAluno.mapa;

import android.content.Context;
import android.location.Location;
import android.os.Bundle;
import android.support.annotation.Nullable;

import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.model.LatLng;

/**
 * Created by Leandro on 18/10/2016.
 */

//classe responsável por gerenciar a parte do GPS
//classe Localizador que centraliza o mapa de acordo com a posição do dispositivo utilizando o GPS.
public class Localizador implements GoogleApiClient.ConnectionCallbacks, com.google.android.gms.location.LocationListener {  //LocationListener

    private final GoogleApiClient client;  //a classe GoogleApiClient serve para fazer a conexão dentro do celular
    private final MapaFragment mapaFragment;

    public Localizador (Context context, MapaFragment mapaFragment){

        client = new GoogleApiClient.Builder(context)
                .addApi(LocationServices.API)  //acessar o LocationsService
                .addConnectionCallbacks(this)
                .build();

        client.connect();
        this.mapaFragment = mapaFragment;
    }

    // metodo em que especificamos o que fazer ao conectar
    @Override
    public void onConnected(@Nullable Bundle bundle) {
        LocationRequest request = new LocationRequest();
        request.setSmallestDisplacement(50); //define o deslocamento minimo
        request.setInterval(1000); //intervalo de envio da posição
        request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);  //com isso teremos uma precisão muito alta

        LocationServices.FusedLocationApi.requestLocationUpdates(client, request, this);

    }

    //metodo em que especificamos o que fazer quando a conexao for suspensa
    @Override
    public void onConnectionSuspended(int i) {
    }

    @Override
    public void onLocationChanged(Location location) {
        LatLng coordenada = new LatLng(location.getLatitude(), location.getLongitude());
        mapaFragment.centralizarEm(coordenada);
    }
}
6 respostas

Olá Leandro,

O erro está avisando que o aplicativo não tem permissão para acessar a localização do dispositivo. Provavelmente existe algo errado com o código que faz o pedido das permissões para o usuário. Dá uma olhada no seu código que faz a checagem das permissões que o aplicativo tem na classe MapaActivity:

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

Perceba que no if estamos verificando se ele tem a permissão ACCESS_COARSE_LOCATION ou a permissão ACCESS_FINE_LOCATION. Na verdade, o que queremos é que o aplicativo tenha ambas permissões. Então nesse caso queremos mudar o || no if para && pois queremos que as duas permissões sejam dadas pelo usuário.

Faça um teste e veja se resolve!

Opa, na verdade me enganei, o código estava correto. Parece que o que está faltando mesmo é só fornecer a autorização. A sua aplicação pede as permissões quando você abre o mapa?

sim. póremantes poder dar a autorização mostra uma mensagem que informa que a aplicação parou. e pergunta se "OK ou "TENTAR NOVAMENTE""

Olá Leandro,

Quando aparece essa mensagem de "O aplicativo parou", o Android deve imprimir uma mensagem de erro, uma Exception explicando o que aconteceu. Tenta postar aqui essa mensagem de erro pra gente ter mais algumas pistas sobre o que está acontecendo.

D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: br.com.cadastroDeAluno, PID: 15217
                  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.zzpr$zza.zzb(Unknown Source)
                      at com.google.android.gms.internal.zzqa.zzf(Unknown Source)
                      at com.google.android.gms.internal.zzqa.zzd(Unknown Source)
                      at com.google.android.gms.internal.zzqf.zzd(Unknown Source)
                      at com.google.android.gms.internal.zzqd.zzd(Unknown Source)
                      at com.google.android.gms.location.internal.zzd.requestLocationUpdates(Unknown Source)
                      at br.com.cadastroDeAluno.mapa.Localizador.onConnected(Localizador.java:43)
                      at com.google.android.gms.common.internal.zzl.zzo(Unknown Source)
                      at com.google.android.gms.internal.zzqd.zzm(Unknown Source)
                      at com.google.android.gms.internal.zzqb.zzapm(Unknown Source)
                      at com.google.android.gms.internal.zzqb.onConnected(Unknown Source)
                      at com.google.android.gms.internal.zzqf.onConnected(Unknown Source)
                      at com.google.android.gms.internal.zzpu.onConnected(Unknown Source)
                      at com.google.android.gms.common.internal.zzk$1.onConnected(Unknown Source)
                      at com.google.android.gms.common.internal.zzd$zzj.zzarz(Unknown Source)
                      at com.google.android.gms.common.internal.zzd$zza.zzc(Unknown Source)
                      at com.google.android.gms.common.internal.zzd$zza.zzx(Unknown Source)
                      at com.google.android.gms.common.internal.zzd$zze.zzasb(Unknown Source)
                      at com.google.android.gms.common.internal.zzd$zzd.handleMessage(Unknown Source)
                      at android.os.Handler.dispatchMessage(Handler.java:111)
                      at android.os.Looper.loop(Looper.java:207)
                      at android.app.ActivityThread.main(ActivityThread.java:5776)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)
D/NativeCrypto: ssl=0x7f71121b00 sslRead buf=0x7f8815e000 len=2048,timeo=2500
W/DynamiteModule: Local module descriptor class for com.google.android.gms.googlecertificates not found.
I/DynamiteModule: Considering local module com.google.android.gms.googlecertificates:0 and remote module com.google.android.gms.googlecertificates:2
I/DynamiteModule: Selected remote version of com.google.android.gms.googlecertificates, version >= 2
D/GoogleCertificates: com.google.android.gms.googlecertificates module is loaded
D/GoogleCertificatesImpl: Fetched 190 Google release certificates
D/GoogleCertificatesImpl: Fetched 363 Google certificates
solução!

retirei a linha que estava dando problema e resolveu o problema:

LocationServices.FusedLocationApi.requestLocationUpdates(client, request, this);