RESOLVIDO: Não foi possível recuperar a localização usando ‘LocationManager.NETWORK_PROVIDER’ mesmo quando o WiFi está ativado no dispositivo executando o Android M
Introdução
A capacidade de rastrear a localização é uma funcionalidade importante em muitos aplicativos móveis hoje em dia. No entanto, às vezes, os desenvolvedores enfrentam desafios ao tentar obter a localização exata de um dispositivo Android. Um problema comum é quando a localização não pode ser recuperada mesmo quando o WiFi está ativado e o provedor de rede é configurado como ‘LocationManager.NETWORK_PROVIDER’. Este artigo aborda esse problema específico e fornece uma solução para resolvê-lo.
Descrição do problema
Ao desenvolver um aplicativo Android compatível com a versão 6.0 Marshmallow (ou superior), pode ocorrer uma situação em que, mesmo com o WiFi ativado, a localização não pode ser recuperada usando o provedor de rede (‘LocationManager.NETWORK_PROVIDER’). Isso pode ser bastante frustrante para os desenvolvedores, pois eles esperam que o provedor de rede forneça uma localização aproximada com base nas informações de rede disponíveis.
Causa do problema
A razão pela qual esse problema ocorre está relacionada às alterações introduzidas no Android 6.0 Marshmallow em relação às permissões de localização. Antes dessa versão, o acesso à localização era tratado com uma única permissão chamada “android.permission.ACCESS_FINE_LOCATION”. No entanto, no Marshmallow, foram introduzidas duas novas permissões: “android.permission.ACCESS_FINE_LOCATION” e “android.permission.ACCESS_COARSE_LOCATION”.
A permissão “ACCESS_FINE_LOCATION” é necessária para obter a localização precisa do dispositivo, enquanto a permissão “ACCESS_COARSE_LOCATION” permite obter uma localização aproximada com base nas informações de rede. Nesse cenário específico, quando o WiFi está ativado, mas a permissão “ACCESS_FINE_LOCATION” não é concedida, o provedor de rede não retorna uma localização válida.
Solução
Para resolver esse problema e garantir que a localização possa ser recuperada usando o provedor de rede, mesmo quando o WiFi está ativado, é necessário solicitar a permissão “ACCESS_COARSE_LOCATION” no código do aplicativo. Abaixo está um exemplo de como fazer isso:
Abra o arquivo AndroidManifest.xml do seu projeto.
Adicione a seguinte linha dentro da tag <manifest>:
<uses-permission android:name=”android.permission.ACCESS_COARSE_LOCATION” />
No código Java ou Kotlin do seu aplicativo, adicione o seguinte trecho para solicitar a permissão em tempo de execução:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_REQUEST_CODE);
}
Certifique-se de substituir “this” pela referência adequada à sua atividade e “PERMISSION_REQUEST_CODE” por um código de solicitação de permissão personalizado.
Implemente o método “onRequestPermissionsResult” para lidar com a resposta da solicitação de permissão:
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == PERMISSION_REQUEST_CODE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Permissão concedida, agora é possível acessar a localização usando o provedor de rede
} else {
// Permissão negada, lidar com essa situação de acordo com as necessidades do seu aplicativo
}
}
}
Conclusão
Ao desenvolver aplicativos Android que exigem a recuperação da localização do dispositivo, é importante estar ciente das alterações introduzidas nas permissões de localização no Android 6.0 Marshmallow e versões posteriores. Garantir que as permissões corretas sejam solicitadas e concedidas é essencial para obter uma localização precisa ou aproximada, dependendo das necessidades do aplicativo. Neste artigo, vimos como resolver o problema de não conseguir recuperar a localização usando ‘LocationManager.NETWORK_PROVIDER’ mesmo quando o WiFi está ativado no dispositivo executando o Android M. Implementar a permissão “ACCESS_COARSE_LOCATION” corretamente resolverá esse problema e permitirá que o provedor de rede retorne a localização esperada.