Falaaaa ae dev’s marotos que acompanham meu blog, pra quem achava que não… SIM, estou de volta com mais um post nessa budega, e hoje vou contar um causo de desenvolvedor.
Recentemente um cliente pediu para eu atualizar o app que eu havia desenvolvido para ser compatível com o novo Android 6.0 Marshmallow.
Até aí nada de mais né, molezinha, abri o Android Studio, fui lá no manifest, alterei pra SDK 23 e fui testar no meu celular (Moto X 2014) que já está com a nova versão do android, qual não foi minha surpresa quando fui testar uma funcionalidade que usava o GPS e … pá, deu force close ¬¬.
Apenas soltei um “PQP” e fui investigar o problema mais a fundo… após debuggar um pouco identiquei que estava estourando um SecurityException na minha classe de atividades de GPS, devido a falta da permissão ACCESS_FINE_LOCATION, sendo que a permissão estava lá no manifest, então logo imaginei que fosse alguma merda na versão 6.0 , pesquisando na documentação oficial identifiquei que nesta nova versão do Android algumas permissões consideradas “perigosas” devem ser solicitadas explicitamente.
Aí vai aparecer aquela janela de confirmação tipo essa aleatória que eu peguei no google.
Então, pra resolver meu problema basicamente fiz um teste para saber a versão do Android que estava usando o aplicativo era maior ou igual a 23 (versão da SDK do Android Marshmallow), fiz minha activity implementar “ActivityCompat.OnRequestPermissionsResultCallback” e sobrescrevi o método onRequestPermissionsResult na activity , abaixo um exemplo de como ficaria.
1 |
public class MinhaActivity implements ActivityCompat.OnRequestPermissionsResultCallback |
1 2 3 4 5 6 7 8 9 |
if (Build.VERSION.SDK_INT = 23) { if (getApplicationContext().checkSelfPermission("android.permission.ACCESS_FINE_LOCATION") != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(MinhaActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, READ_GPS_REQUEST_CODE); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
@Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case READ_GPS_REQUEST_CODE: { // Se o usuário não deu permissão o array está vazio. if (grantResults.length > 0 grantResults[0] == PackageManager.PERMISSION_GRANTED) { // permissão concedida, executo minha atividade } else { // permissão negada, mostra uma mensagem pro usuário informando que tal funcionalidade não poderá ser executada } return; } } } |
Essa constante READ_GPS_REQUEST_CODE é uma constante com o valor 12 que eu criei.
Com isso, tudo voltou a funcionar lindamente como deveria 😀
Referências:
http://developer.android.com/intl/pt-br/training/permissions/requesting.html
http://developer.android.com/intl/pt-br/reference/android/Manifest.permission.html
#parti
Resolvendo o erro de GPS/Permissões no Android 6.0,