Un móvil Android realmente sabe muy bien dónde está, pero ¿hay alguna forma de recuperar el país mediante un código de país?
No es necesario conocer la posición exacta del GPS: el país es suficiente
Primero pensé en usar la zona horaria, pero en realidad necesito más información que eso, ya que hace una diferencia si la ubicación es Nueva York o Lima.
El trasfondo de la pregunta: tengo una aplicación que utiliza valores de temperatura y me gustaría establecer la unidad predeterminada en grados Celsius o Fahrenheit, dependiendo de si la ubicación es de EE. UU.
android
geolocation
DonGru
fuente
fuente
Respuestas:
Esto obtendrá el código de país establecido para el teléfono (idioma del teléfono, NO ubicación del usuario):
también puede reemplazar getCountry () con getISO3Country () para obtener un código ISO de 3 letras para el país. Esto obtendrá el nombre del país :
Esto parece más fácil que los otros métodos y depende de la configuración de localización en el teléfono, por lo que si un usuario de EE. UU. Está en el extranjero, probablemente todavía quieran Fahrenheit y esto funcionará :)
Nota del editor : esta solución no tiene nada que ver con la ubicación del teléfono. Es constante. Cuando viaje a Alemania, la ubicación NO cambiará. En resumen: locale! = Ubicación.
fuente
fuente
getSimCountryIso
diráus
ygetNetworkCountryIso
diráfr
toLowerCase()
llamada atoUpperCase()
.Utilice este enlace http://ip-api.com/json , esto proporcionará toda la información como json. Desde este json puedes obtener el país fácilmente. Este sitio funciona utilizando su IP actual, detecta automáticamente la IP y los detalles de devolución.
Docs http://ip-api.com/docs/api:json Espero que ayude.
Ejemplo json
nota : Como esta es una solución de terceros, solo úsela si otras no funcionaron.
fuente
En realidad, acabo de descubrir que hay incluso una forma más de obtener un código de país, utilizando el método getSimCountryIso () de
TelephoneManager
:Dado que es el código sim, tampoco debería cambiar cuando se viaja a otros países.
fuente
Primero, obtenga el LocationManager. Entonces llama
LocationManager.getLastKnownPosition
. Luego cree un GeoCoder y llameGeoCoder.getFromLocation
. ¡Esto está en un hilo separado! Esto te dará una lista deAddress
objetos. LlamaAddress.getCountryName
y lo tienes.Tenga en cuenta que la última posición conocida puede ser un poco obsoleta, por lo que si el usuario acaba de cruzar el borde, es posible que no lo sepa por un tiempo.
fuente
Aquí hay una solución completa basada en el LocationManager y, como respaldo, las ubicaciones de TelephonyManager y del proveedor de red. Utilicé la respuesta anterior de @Marco W. para la parte alternativa (¡gran respuesta en sí misma!).
Nota: el código contiene PreferencesManager, esta es una clase auxiliar que guarda y carga datos de SharedPrefrences. Lo estoy usando para guardar el país en S "P, solo obtengo el país si está vacío. Para mi producto, realmente no me importan todos los casos extremos (el usuario viaja al extranjero, etc.).
fuente
country = addresses.get(0).getCountryName();
en su código, que pondrá el nombre completo del país en variablecountry
. Al mismo tiempo, en el métodogetCountryBasedOnSimCardOrNetwork(Context context)
, está devolviendo el código ISO del país. Creo que querías escribircountry = addresses.get(0).getCountryCode();
:-)Puede usar
getNetworkCountryIso()
desdeTelephonyManager
para obtener el país en el que se encuentra actualmente el teléfono (aunque aparentemente esto no es confiable en las redes CDMA).fuente
Es obsoleto. Use esto en su lugar:
fuente
Para algunos dispositivos, si el idioma predeterminado es diferente (un indio puede configurar el inglés (EE. UU.)), Entonces
dará un valor incorrecto. Así que este método no es confiable
Además, el método getNetworkCountryIso () de TelephonyManager no funcionará en dispositivos que no tengan tarjeta SIM (tabletas WIFI).
Si un dispositivo no tiene SIM, podemos usar la zona horaria para obtener el país. Para países como India, este método funcionará
el código de muestra utilizado para verificar si el país es India o no (Id. de zona horaria: asia / calcutta)
fuente
Usando GPS con latitud y longitud, podemos obtener el código del país.
Si usamos la telefonía, no funcionará si no estamos usando la tarjeta SIM y en la configuración regional, según el idioma, muestra el código del país de manera incorrecta.
MainActivity.java:
GPSTracker.java:
Iniciar sesión:
E / countryCode: IN
Editar: use el proveedor de ubicación fusionada para obtener la actualización de latitud y longitud para un mejor resultado.
fuente
Usé GEOIP db y creé una función. Puede consumir este enlace directamente http://jamhubsoftware.com/geoip/getcountry.php
puede descargar el archivo autoload.php y .mmdb desde https://dev.maxmind.com/geoip/geoip2/geolite2/
fuente