Telefon z Androidem faktycznie dobrze wie, gdzie się znajduje - ale czy istnieje sposób na odzyskanie kraju za pomocą czegoś w rodzaju kodu kraju?
Nie trzeba znać dokładnej pozycji GPS - wystarczy kraj
Najpierw pomyślałem o użyciu strefy czasowej, ale w rzeczywistości potrzebuję więcej informacji, ponieważ ma znaczenie, czy lokalizacja to Nowy Jork czy Lima.
Tło pytania: Mam aplikację, która używa wartości temperatury i chciałbym ustawić domyślną jednostkę na Celsjusza lub Fahrenheita, w zależności od tego, czy lokalizacja jest w USA czy poza nią
android
geolocation
DonGru
źródło
źródło
Odpowiedzi:
Spowoduje to ustawienie kodu kraju dla telefonu (język telefonu, NIE lokalizacja użytkownika):
można również zamienić getCountry () na getISO3Country (), aby uzyskać 3-literowy kod ISO kraju. Spowoduje to wyświetlenie nazwy kraju :
Wydaje się to łatwiejsze niż inne metody i polega na ustawieniach lokalizacji w telefonie, więc jeśli użytkownik z USA jest za granicą, prawdopodobnie nadal będzie chciał Fahrenheita i to zadziała :)
Uwaga redakcji : To rozwiązanie nie ma nic wspólnego z lokalizacją telefonu. To jest stałe. Podczas podróży do Niemiec lokalizacja NIE ulegnie zmianie. W skrócie: locale! = Location.
źródło
źródło
getSimCountryIso
powieus
igetNetworkCountryIso
powiefr
toLowerCase()
połączenie natoUpperCase()
.Użyj tego linku http://ip-api.com/json , dostarczy to wszystkich informacji jako json. Z tego json'a możesz łatwo pobrać kraj. Ta strona działa przy użyciu Twojego aktualnego adresu IP, automatycznie wykrywa adres IP i szczegóły odesłania.
Dokumenty http://ip-api.com/docs/api:json Mam nadzieję, że to pomoże.
Przykład json
Uwaga : ponieważ jest to rozwiązanie innej firmy, używaj tylko wtedy, gdy inne nie działają.
źródło
Właściwie właśnie się dowiedziałem, że istnieje jeszcze jeden sposób uzyskania kodu kraju, przy użyciu metody getSimCountryIso ()
TelephoneManager
:Ponieważ jest to kod karty SIM, nie powinien również zmieniać się podczas podróży do innych krajów.
źródło
Najpierw pobierz LocationManager. Następnie zadzwoń
LocationManager.getLastKnownPosition
. Następnie utwórz GeoCoder i wywołajGeoCoder.getFromLocation
. Zrób to w osobnym wątku !! To da ci listęAddress
obiektów. ZadzwońAddress.getCountryName
i masz to.Pamiętaj, że ostatnia znana pozycja może być trochę nieaktualna, więc jeśli użytkownik właśnie przekroczył granicę, możesz przez chwilę o tym nie wiedzieć.
źródło
Oto kompletne rozwiązanie oparte na LocationManager i jako rozwiązanie zastępcze TelephonyManager i lokalizacje dostawcy sieci. Użyłem powyższej odpowiedzi od @Marco W. dla części rezerwowej (świetna odpowiedź sama w sobie!).
Uwaga: kod zawiera PreferencesManager, jest to klasa pomocnicza, która zapisuje i ładuje dane z SharedPrefrences. Używam go, aby zapisać kraj na S "P, odbieram kraj tylko wtedy, gdy jest pusty. W przypadku mojego produktu nie obchodzą mnie wszystkie skrajne przypadki (użytkownik podróżuje za granicę i tak dalej).
źródło
country = addresses.get(0).getCountryName();
twoim kodzie znajduje się, który umieści pełną nazwę kraju w zmiennejcountry
. W tym samym czasiegetCountryBasedOnSimCardOrNetwork(Context context)
zwracasz kod ISO kraju. Myślę, że chciałeś napisaćcountry = addresses.get(0).getCountryCode();
:-)Możesz użyć
getNetworkCountryIso()
od,TelephonyManager
aby uzyskać kraj, w którym aktualnie znajduje się telefon (chociaż najwyraźniej jest to zawodne w sieciach CDMA).źródło
Jest przestarzałe. Użyj tego zamiast tego:
źródło
W przypadku niektórych urządzeń, jeśli domyślny język jest ustawiony inaczej (Hindus może ustawić angielski (USA))
poda błędną wartość. więc ta metoda jest zawodna
Ponadto metoda getNetworkCountryIso () w TelephonyManager nie będzie działać na urządzeniach bez karty SIM (tablety WIFI).
Jeśli urządzenie nie ma karty SIM, możemy użyć strefy czasowej, aby uzyskać kraj. W krajach takich jak Indie ta metoda będzie działać
przykładowy kod używany do sprawdzenia, czy kraj to Indie czy nie (identyfikator strefy czasowej: asia / calcutta)
źródło
Używając GPS z szerokością i długością geograficzną, możemy uzyskać kod kraju.
Jeśli korzystamy z telefonii, nie zadziała, jeśli nie używamy karty SIM, a lokalnie, w oparciu o język, pokazuje kod kraju w niewłaściwy sposób.
MainActivity.java:
GPSTracker.java:
Log:
E / countryCode: IN
Edycja: użyj dostawcy lokalizacji połączonej, aby uzyskać aktualizację szerokości i długości geograficznej w celu uzyskania lepszych wyników.
źródło
Użyłem bazy danych GEOIP i utworzyłem funkcję. Możesz skorzystać z tego łącza bezpośrednio http://jamhubsoftware.com/geoip/getcountry.php
możesz pobrać pliki autoload.php i .mmdb z https://dev.maxmind.com/geoip/geoip2/geolite2/
źródło