Um celular Android realmente sabe muito bem onde está - mas existe uma maneira de recuperar o país com algo como um código de país?
Não é necessário saber a posição exata do GPS - o país é suficiente
Primeiro pensei em usar o fuso horário, mas na verdade preciso de mais informações, pois isso faz diferença se o local for Nova York ou Lima.
O pano de fundo da pergunta: eu tenho um aplicativo que usa valores de temperatura e gostaria de definir a unidade padrão como Celsius ou Fahrenheit, dependendo se o local é norte-americano ou externo
android
geolocation
DonGru
fonte
fonte
Respostas:
Isso obterá o código do país definido para o telefone (idioma do telefone, NÃO localização do usuário):
também pode substituir getCountry () por getISO3Country () para obter um código ISO de três letras para o país. Isso obterá o nome do país :
Isso parece mais fácil do que os outros métodos e depende das configurações de localização do telefone; portanto, se um usuário americano estiver no exterior, provavelmente ainda desejará Fahrenheit e isso funcionará :)
Nota dos editores : Esta solução não tem nada a ver com a localização do telefone. É constante. Quando você viaja para a Alemanha, a localidade NÃO muda. Em resumo: locale! = Local.
fonte
fonte
getSimCountryIso
diráus
egetNetworkCountryIso
dirá #fr
toLowerCase()
chamada paratoUpperCase()
.Use este link http://ip-api.com/json , isso fornecerá todas as informações como json. A partir deste json, você pode obter o país facilmente. Este site funciona usando seu IP atual, ele detecta automaticamente os detalhes de IP e de retorno.
Documentos http://ip-api.com/docs/api:json Espero que ajude.
Exemplo json
Nota : Como esta é uma solução de terceiros, use somente se outras pessoas não funcionarem.
fonte
Na verdade, acabei de descobrir que há mais uma maneira de obter um código de país, usando o método getSimCountryIso () de
TelephoneManager
:Por ser o código sim, ele também não deve ser alterado quando se viaja para outros países.
fonte
Primeiro, obtenha o LocationManager. Então ligue
LocationManager.getLastKnownPosition
. Em seguida, crie um GeoCoder e ligueGeoCoder.getFromLocation
. Faça isso em um thread separado !! Isso fornecerá uma lista deAddress
objetos. LigueAddress.getCountryName
e você conseguiu.Lembre-se de que a última posição conhecida pode ser um pouco obsoleta; portanto, se o usuário cruzar a fronteira, talvez você não saiba disso por um tempo.
fonte
Aqui está uma solução completa baseada no LocationManager e como substitutos dos locais do TelephonyManager e do provedor de rede. Eu usei a resposta acima de @Marco W. na parte de fallback (ótima resposta como ela mesma!).
Nota: o código contém PreferencesManager, esta é uma classe auxiliar que salva e carrega dados de SharedPrefrences. Estou usando-o para salvar o país em S "P, só estou conseguindo o país se estiver vazio. Para o meu produto, eu realmente não me importo com todos os casos extremos (o usuário viaja para o exterior e assim por diante).
fonte
country = addresses.get(0).getCountryName();
em seu código, o que vai colocar nome completo do país na variávelcountry
. Ao mesmo tempo, no método,getCountryBasedOnSimCardOrNetwork(Context context)
você está retornando o código ISO do país. Eu acredito que você queria escrevercountry = addresses.get(0).getCountryCode();
:-)Você pode usar
getNetworkCountryIso()
deTelephonyManager
para obter o país em que o telefone está atualmente (embora aparentemente isso não seja confiável nas redes CDMA).fonte
Está obsoleto. Use isso:
fonte
Para alguns dispositivos, se o idioma padrão estiver definido diferente (um indiano pode definir inglês (EUA)),
dará valor errado. Portanto, este método não é confiável
Além disso, o método getNetworkCountryIso () do TelephonyManager não funcionará em dispositivos que não possuem cartão SIM (tablets WIFI).
Se um dispositivo não tiver SIM, podemos usar o fuso horário para obter o país. Para países como a Índia, esse método funcionará
o código de exemplo usado para verificar se o país é Índia ou não (ID de fuso horário: asia / calcutá)
fonte
Usando GPS com latitude e longitude, podemos obter o código do país.
Se usarmos telefonia, não funcionará se não estivermos usando o cartão SIM e no local, com base no idioma, mostrará o código do país de maneira incorreta.
MainActivity.java:
GPSTracker.java:
Registro:
E / countryCode: IN
Edit: Use Fused Location Provider para obter atualizações de latitude e longitude para obter melhores resultados.
fonte
Eu usei GEOIP db e criei uma função. Você pode consumir esse link diretamente http://jamhubsoftware.com/geoip/getcountry.php
você pode baixar o arquivo autoload.php e .mmdb em https://dev.maxmind.com/geoip/geoip2/geolite2/
fonte