Un mobile Android sait en fait assez bien où il se trouve - mais existe-t-il un moyen de récupérer le pays par quelque chose comme un code de pays?
Pas besoin de connaître la position GPS exacte - le pays suffit
J'ai d'abord pensé à utiliser le fuseau horaire, mais en fait j'ai besoin de plus d'informations car cela fait une différence si l'emplacement est New York ou Lima.
Le contexte de la question: j'ai une application qui utilise des valeurs de température, et j'aimerais définir l'unité par défaut sur Celsius ou Fahrenheit, selon que l'emplacement est aux États-Unis ou à l'extérieur
android
geolocation
DonGru
la source
la source
Réponses:
Cela obtiendra le code de pays défini pour le téléphone (langue du téléphone, PAS l'emplacement de l'utilisateur):
peut également remplacer getCountry () par getISO3Country () pour obtenir un code ISO de 3 lettres pour le pays. Cela obtiendra le nom du pays :
Cela semble plus facile que les autres méthodes et repose sur les paramètres de localisation du téléphone, donc si un utilisateur américain est à l'étranger, il veut probablement toujours Fahrenheit et cela fonctionnera :)
Note des éditeurs : cette solution n'a rien à voir avec l'emplacement du téléphone. C'est constant. Lorsque vous voyagez en Allemagne, les paramètres régionaux ne changeront PAS. En bref: locale! = Emplacement.
la source
la source
getSimCountryIso
il diraus
etgetNetworkCountryIso
dirafr
toLowerCase()
appel entoUpperCase()
.Utilisez ce lien http://ip-api.com/json , cela fournira toutes les informations sous forme de json. De ce json, vous pouvez obtenir le pays facilement. Ce site fonctionne en utilisant votre adresse IP actuelle, il détecte automatiquement l'adresse IP et les détails de renvoi.
Docs http://ip-api.com/docs/api:json J'espère que cela aide.
Exemple json
Remarque : comme il s'agit d'une solution tierce, utilisez uniquement si les autres ne fonctionnent pas.
la source
En fait, je viens de découvrir qu'il existe encore un moyen d'obtenir un code de pays, en utilisant la méthode getSimCountryIso () de
TelephoneManager
:Comme il s'agit du code SIM, il ne devrait pas non plus changer lors d'un voyage dans d'autres pays.
la source
Tout d'abord, récupérez le LocationManager. Ensuite, appelez
LocationManager.getLastKnownPosition
. Créez ensuite un GeoCoder et appelezGeoCoder.getFromLocation
. Faites cela dans un fil séparé !! Cela vous donnera une liste d'Address
objets. AppelezAddress.getCountryName
et vous l'avez.Gardez à l'esprit que la dernière position connue peut être un peu obsolète, donc si l'utilisateur vient de traverser la frontière, vous ne le saurez peut-être pas pendant un certain temps.
la source
Voici une solution complète basée sur le LocationManager et en tant que solutions de secours, le TelephonyManager et les emplacements du fournisseur de réseau. J'ai utilisé la réponse ci-dessus de @Marco W. pour la partie de secours (excellente réponse en soi!).
Remarque: le code contient PreferencesManager, il s'agit d'une classe d'assistance qui enregistre et charge les données de SharedPrefrences. Je l'utilise pour enregistrer le pays en S "P, je ne reçois le pays que s'il est vide. Pour mon produit, je ne me soucie pas vraiment de tous les cas marginaux (l'utilisateur voyage à l'étranger, etc.).
la source
country = addresses.get(0).getCountryName();
dans votre code, qui mettra le nom complet du pays dans la variablecountry
. Dans le même temps,getCountryBasedOnSimCardOrNetwork(Context context)
vous renvoyez le code ISO du pays. Je crois que tu voulais écrirecountry = addresses.get(0).getCountryCode();
:-)Vous pouvez utiliser
getNetworkCountryIso()
fromTelephonyManager
pour obtenir le pays dans lequel se trouve actuellement le téléphone (bien que cela ne soit apparemment pas fiable sur les réseaux CDMA).la source
Est obsolète. Utilisez plutôt ceci:
la source
Pour certains appareils, si la langue par défaut est différente (un Indien peut définir l'anglais (US)), alors
donnera une valeur erronée .Cette méthode n'est donc pas fiable
De plus, la méthode getNetworkCountryIso () de TelephonyManager ne fonctionnera pas sur les appareils qui n'ont pas de carte SIM (tablettes WIFI).
Si un appareil n'a pas de carte SIM, nous pouvons utiliser le fuseau horaire pour obtenir le pays. Pour des pays comme l'Inde, cette méthode fonctionnera
exemple de code utilisé pour vérifier si le pays est l'Inde ou non (ID de fuseau horaire: asia / calcutta)
la source
En utilisant le GPS avec latitude et longitude, nous pouvons obtenir le code du pays.
Si nous utilisons la téléphonie, cela ne fonctionnera pas si nous n'utilisons pas de carte SIM et dans les paramètres régionaux, en fonction de la langue, il affiche le code du pays de manière incorrecte.
MainActivity.java:
GPSTracker.java:
Journal:
E / countryCode: IN
Modifier: utilisez le fournisseur d'emplacement fusionné pour obtenir la mise à jour de la latitude et de la longitude pour un meilleur résultat
la source
J'ai utilisé GEOIP db et créé une fonction. Vous pouvez utiliser ce lien directement http://jamhubsoftware.com/geoip/getcountry.php
vous pouvez télécharger le fichier autoload.php et .mmdb à partir de https://dev.maxmind.com/geoip/geoip2/geolite2/
la source