Estou tentando obter as coordenadas de GPS para exibição quando clico em um botão no layout de minha atividade. A seguir está o método que é chamado quando clico no botão:
public void getLocation(View view) {
TextView tv = (TextView) findViewById(R.id.gps_coord_view);
LocationManager lm = (LocationManager) getSystemService(LOCATION_SERVICE);
Location loc = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
tv.setText("Latitude: " + loc.getLatitude() + "\nLongitude: " + loc.getLongitude());
}
Estou recebendo um erro que diz
A chamada requer permissão, que pode ser rejeitada pelo usuário. O código deve verificar explicitamente se a permissão está disponível.
Já conceda essas permissões no meu AndroidManifest
. O erro é resolvido e o aplicativo é compilado quando eu adiciono o seguinte antes de chamar lm.getLastKnownLocation
:
if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
&& checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
No entanto, o aplicativo trava quando pressiono o botão que chama getLocation quando é clicado. O que está acontecendo? Existe uma maneira melhor / mais simples de obter as coordenadas GPS do dispositivo?
android
locationmanager
do utilizador
fonte
fonte
Respostas:
Com o nível de API do Android (23), somos obrigados a verificar as permissões. https://developer.android.com/training/permissions/requesting.html
Eu tive o mesmo problema, mas o seguinte funcionou para mim e consigo recuperar os dados de localização com sucesso:
(1) Certifique-se de ter suas permissões listadas no Manifesto:
(2) Certifique-se de solicitar permissões do usuário:
(3) Certifique-se de usar ContextCompat, pois ele é compatível com os níveis de API mais antigos.
(4) Em seu serviço de localização, ou classe que inicializa seu LocationManager e obtém a última localização conhecida, precisamos verificar as permissões:
(5) Essa abordagem só funcionou para mim depois que incluí @TargetApi (23) no início do meu método initLocationService.
(6) Eu também adicionei isso à minha versão do Gradle:
Aqui está meu LocationService para referência:
Eu testei com um dispositivo Android Lollipop apenas até agora. Espero que funcione para voce.
fonte
SOLUÇÃO SIMPLES
Eu queria oferecer suporte a aplicativos anteriores à API 23 e, em vez de usar
checkSelfPermission
, usei um try / catchfonte
A última parte da mensagem de erro que você citou afirma:
...with ("checkPermission") or explicitly handle a potential "SecurityException"
Uma maneira muito mais rápida / simples de verificar se você tem permissões é cercar seu código com
try { ... } catch (SecurityException e) { [insert error handling code here] }
. Se você tiver permissões, a parte 'tentar' será executada; se não tiver, a parte 'pegar' será executada.fonte
Use minha classe personalizada para verificar ou solicitar permissão
fonte
se você estiver trabalhando com permissões dinâmicas e qualquer permissão como ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION dando o erro "não é possível resolver o método PERMISSION_NAME" , neste caso, escreva seu código com o nome de permissão e, em seguida, reconstrua seu projeto, isso irá regenerar o arquivo de manifesto (Manifest.permission).
fonte
Se você simplesmente deseja verificar as permissões (em vez de solicitar permissões), escrevi uma extensão simples como esta:
Agora, se eu quiser verificar se há uma permissão, posso simplesmente passar uma permissão como esta:
fonte