Где я? - Получить страну
мобильный android на самом деле знает довольно хорошо, где он находится - но есть ли способ получения страны с помощью чего-то вроде кода страны?
нет необходимости знать точное положение GPS-the страны достаточно
сначала я подумал об использовании часового пояса, но на самом деле мне нужно больше информации, так как это имеет значение, если место находится в Нью-Йорке или Лиме.
история вопроса: у меня есть приложение, которое использует значения температуры, и я хотел бы установить единицу измерения по умолчанию либо по Цельсию, либо по Фаренгейту, в зависимости от того, является ли местоположение США или снаружи
10 ответов:
это будет код страны:
String locale = context.getResources().getConfiguration().locale.getCountry();также можно заменить getCountry () на getISO3Country () чтобы получить 3-х буквенный код ISO для страны. Это будет получить название страны:
String locale = context.getResources().getConfiguration().locale.getDisplayCountry();Это кажется проще, чем другие методы и полагаться на настройки локализации на телефоне, так что если пользователь США находится за границей, они, вероятно, все еще хотят Фаренгейта, и это будет работать:)
/** * Get ISO 3166-1 alpha-2 country code for this device (or null if not available) * @param context Context reference to get the TelephonyManager instance from * @return country code or null */ public static String getUserCountry(Context context) { try { final TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); final String simCountry = tm.getSimCountryIso(); if (simCountry != null && simCountry.length() == 2) { // SIM country code is available return simCountry.toLowerCase(Locale.US); } else if (tm.getPhoneType() != TelephonyManager.PHONE_TYPE_CDMA) { // device is not 3G (would be unreliable) String networkCountry = tm.getNetworkCountryIso(); if (networkCountry != null && networkCountry.length() == 2) { // network country code is available return networkCountry.toLowerCase(Locale.US); } } } catch (Exception e) { } return null; }
На самом деле я только что узнал, что есть еще один способ получить код страны, используя метод getSimCountryIso ()
TelephoneManager:TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); String countryCode = tm.getSimCountryIso();Так как это sim-код, он также не должен меняться при поездках в другие страны.
используйте эту ссылку http://ip-api.com/json, это обеспечит всю информацию как json. Из этого json вы можете легко получить страну. Этот сайт работает с использованием вашего текущего IP, он автоматически определяет IP и детали обратной связи.
Docs http://ip-api.com/docs/api:json надеюсь, что это поможет.
пример json
{ "status": "success", "country": "United States", "countryCode": "US", "region": "CA", "regionName": "California", "city": "San Francisco", "zip": "94105", "lat": "37.7898", "lon": "-122.3942", "timezone": "America/Los_Angeles", "isp": "Wikimedia Foundation", "org": "Wikimedia Foundation", "as": "AS14907 Wikimedia US network", "query": "208.80.152.201" }Примечание: поскольку это стороннее решение, используйте его только в том случае, если другие не работают.
во-первых, получить LocationManager. Тогда звоните
LocationManager.getLastKnownPosition. Затем создайте геокодер и вызовитеGeoCoder.getFromLocation. Сделать это в отдельном потоке!! Это даст вам списокAddressобъекты. ЗвонитеAddress.getCountryNameи вы его получили.имейте в виду, что последняя известная позиция может быть немного скучным, так что если пользователь просто перешел границу, вы можете не знать об этом.
вы могли бы использовать
getNetworkCountryIso()сTelephonyManagerчтобы получить страну, в которой в настоящее время находится телефон (хотя, по-видимому, это ненадежно в сетях CDMA).
вот полное решение, основанное на LocationManager и как резервные копии TelephonyManager и местоположения поставщика сети. Я использовал приведенный выше ответ от @Marco W. для резервной части(отличный ответ как таковой!).
Примечание: код содержит PreferencesManager, это вспомогательный класс, который сохраняет и загружает данные из SharedPrefrences. Я использую его, чтобы спасти страну до S"P, я только получаю страну, если она пуста. Для моего продукта я действительно не забочусь обо всех крайние случаи (пользователь выезжает за границу и так далее).
public static String getCountry(Context context) { String country = PreferencesManager.getInstance(context).getString(COUNTRY); if (country != null) { return country; } LocationManager locationManager = (LocationManager) PiplApp.getInstance().getSystemService(Context.LOCATION_SERVICE); if (locationManager != null) { Location location = locationManager .getLastKnownLocation(LocationManager.GPS_PROVIDER); if (location == null) { location = locationManager .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); } else { Geocoder gcd = new Geocoder(context, Locale.getDefault()); List<Address> addresses; try { addresses = gcd.getFromLocation(location.getLatitude(), location.getLongitude(), 1); if (addresses != null && !addresses.isEmpty()) { country = addresses.get(0).getCountryName(); if (country != null) { PreferencesManager.getInstance(context).putString(COUNTRY, country); return country; } } } catch (Exception e) { e.printStackTrace(); } } } country = getCountryBasedOnSimCardOrNetwork(context); if (country != null) { PreferencesManager.getInstance(context).putString(COUNTRY, country); return country; } return null; } /** * Get ISO 3166-1 alpha-2 country code for this device (or null if not available) * * @param context Context reference to get the TelephonyManager instance from * @return country code or null */ private static String getCountryBasedOnSimCardOrNetwork(Context context) { try { final TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); final String simCountry = tm.getSimCountryIso(); if (simCountry != null && simCountry.length() == 2) { // SIM country code is available return simCountry.toLowerCase(Locale.US); } else if (tm.getPhoneType() != TelephonyManager.PHONE_TYPE_CDMA) { // device is not 3G (would be unreliable) String networkCountry = tm.getNetworkCountryIso(); if (networkCountry != null && networkCountry.length() == 2) { // network country code is available return networkCountry.toLowerCase(Locale.US); } } } catch (Exception e) { } return null; }
используя GPS с широтой и долготой, мы можем получить код страны.
Если мы используем телефонию, она не будет работать, если мы не используем sim-карту и в локали, на основе языка, он показывает код страны в неправильном направлении.
MainActivity.java:
GPSTracker gpsTrack; public static double latitude = 0; public static double longitude = 0; gpsTrack = new GPSTracker(TabHomeActivity.this); if (gpsTrack.canGetLocation()) { latitude = gpsParty.getLatitude(); longitude = gpsParty.getLongitude(); Log.e("GPSLat", "" + latitude); Log.e("GPSLong", "" + longitude); } else { gpsTrack.showSettingsAlert(); Log.e("ShowAlert", "ShowAlert"); } countryCode = getAddress(TabHomeActivity.this, latitude, longitude); Log.e("countryCode", ""+countryCode); public String getAddress(Context ctx, double latitude, double longitude) { String region_code = null; try { Geocoder geocoder = new Geocoder(ctx, Locale.getDefault()); List<Address> addresses = geocoder.getFromLocation(latitude, longitude, 1); if (addresses.size() > 0) { Address address = addresses.get(0); region_code = address.getCountryCode(); } } catch (IOException e) { Log.e("tag", e.getMessage()); } return region_code; }GPSTracker.java:
import android.app.AlertDialog; import android.app.Service; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.os.IBinder; import android.provider.Settings; import android.util.Log; public class GPSTracker extends Service implements LocationListener { private final Context mContext; // flag for GPS status boolean isGPSEnabled = false; // flag for network status boolean isNetworkEnabled = false; // flag for GPS status boolean canGetLocation = false; Location location; // location double latitude; // latitude double longitude; // longitude // The minimum distance to change Updates in meters private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters // The minimum time between updates in milliseconds private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute // Declaring a Location Manager protected LocationManager locationManager; public GPSTracker(Context context) { this.mContext = context; getLocation(); } public Location getLocation() { try { locationManager = (LocationManager) mContext .getSystemService(LOCATION_SERVICE); // getting GPS status isGPSEnabled = locationManager .isProviderEnabled(LocationManager.GPS_PROVIDER); // getting network status isNetworkEnabled = locationManager .isProviderEnabled(LocationManager.NETWORK_PROVIDER); if (!isGPSEnabled && !isNetworkEnabled) { // no network provider is enabled } else { this.canGetLocation = true; // First get location from Network Provider if (isNetworkEnabled) { locationManager.requestLocationUpdates( LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this); Log.d("Network", "Network"); if (locationManager != null) { location = locationManager .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); if (location != null) { latitude = location.getLatitude(); longitude = location.getLongitude(); } } } // if GPS Enabled get lat/long using GPS Services if (isGPSEnabled) { if (location == null) { locationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this); Log.d("GPS Enabled", "GPS Enabled"); if (locationManager != null) { location = locationManager .getLastKnownLocation(LocationManager.GPS_PROVIDER); if (location != null) { latitude = location.getLatitude(); longitude = location.getLongitude(); } } } } } } catch (Exception e) { e.printStackTrace(); } return location; } /** * Stop using GPS listener * Calling this function will stop using GPS in your app * */ public void stopUsingGPS(){ if(locationManager != null){ locationManager.removeUpdates(GPSTracker.this); } } /** * Function to get latitude * */ public double getLatitude(){ if(location != null){ latitude = location.getLatitude(); } // return latitude return latitude; } /** * Function to get longitude * */ public double getLongitude(){ if(location != null){ longitude = location.getLongitude(); } // return longitude return longitude; } /** * Function to check GPS/wifi enabled * @return boolean * */ public boolean canGetLocation() { return this.canGetLocation; } public void showSettingsAlert() { final AlertDialog.Builder builder = new AlertDialog.Builder(mContext); builder.setMessage("Your GPS seems to be disabled, do you want to enable it?") .setCancelable(false) .setPositiveButton("Yes", new DialogInterface.OnClickListener() { public void onClick(@SuppressWarnings("unused") final DialogInterface dialog, @SuppressWarnings("unused") final int id) { mContext.startActivity(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS)); } }) .setNegativeButton("No", new DialogInterface.OnClickListener() { public void onClick(final DialogInterface dialog, @SuppressWarnings("unused") final int id) { dialog.cancel(); } }); final AlertDialog alert = builder.create(); alert.show(); } @Override public void onLocationChanged(Location location) { } @Override public void onProviderDisabled(String provider) { } @Override public void onProviderEnabled(String provider) { } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public IBinder onBind(Intent arg0) { return null; } }Log:
E / countryCode: на
Edit: использовать Сплавленный Провайдер Положения получить обновление широты и долготы для лучшего результата.
String locale = context.getResources().getConfiguration().locale.getCountry();устарела. Используйте этот код:
Locale locale; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { locale = context.getResources().getConfiguration().getLocales().get(0); } else { locale = context.getResources().getConfiguration().locale; }
я использовал GeoIP db и создал функцию. Вы можете использовать эту ссылку напрямую http://jamhubsoftware.com/geoip/getcountry.php
{"country":["India"],"isoCode":["IN"],"names":[{"de":"Indien","en":"India","es":"India","fr":"Inde","ja":"\u30a4\u30f3\u30c9","pt-BR":"\u00cdndia","ru":"\u0418\u043d\u0434\u0438\u044f","zh-CN":"\u5370\u5ea6"}]}вы можете скачать Автозагрузка.php и .mmdb файл изhttps://dev.maxmind.com/geoip/geoip2/geolite2/
ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); $ip_address = $_SERVER['REMOTE_ADDR']; //$ip_address = '3.255.255.255'; require_once 'vendor/autoload.php'; use GeoIp2\Database\Reader; // This creates the Reader object, which should be reused across // lookups. $reader = new Reader('/var/www/html/geoip/GeoLite2-City.mmdb'); // Replace "city" with the appropriate method for your database, e.g., // "country". $record = $reader->city($ip_address); //print($record->country->isoCode . "\n"); // 'US' //print($record->country->name . "\n"); // 'United States' $rows['country'][] = $record->country->name; $rows['isoCode'][] = $record->country->isoCode; $rows['names'][] = $record->country->names; print json_encode($rows); //print($record->country->names['zh-CN'] . "\n"); // '美国' // //print($record->mostSpecificSubdivision->name . "\n"); // 'Minnesota' //print($record->mostSpecificSubdivision->isoCode . "\n"); // 'MN' // //print($record->city->name . "\n"); // 'Minneapolis' // //print($record->postal->code . "\n"); // '55455' // //print($record->location->latitude . "\n"); // 44.9733 //print($record->location->longitude . "\n"); // -93.2323 ?>
Comments