Где я? - Получить страну

Мобильный телефон Android действительно хорошо знает, где он находится, но есть ли способ получить страну с помощью чего-то вроде кода страны?

Нет необходимости знать точное положение GPS — достаточно страны

Сначала я подумал об использовании часового пояса, но на самом деле мне нужно больше информации, поскольку имеет значение, является ли место Нью-Йорком или Лимой.

Предыстория вопроса: у меня есть приложение, использующее значения температуры, и я хочу установить единицу измерения по умолчанию либо по Цельсию, либо по Фаренгейту, в зависимости от того, находится ли я в США или за ее пределами.


person DonGru    schedule 07.09.2010    source источник
comment
-1: Вы определенно не хотите знать, где находится пользователь . Вы хотите знать настройки локали пользователя. Принятый ответ отвечает именно на это, но в остальном здесь совершенно неуместен, потому что поиск укажет здесь людей, которые действительно хотят знать, где на самом деле находится пользователь.   -  person Jan Hudec    schedule 01.08.2013


Ответы (10)


При этом для телефона будет установлен код страны ( язык телефонов, а НЕ местоположение пользователя):

 String locale = context.getResources().getConfiguration().locale.getCountry(); 

также можно заменить getCountry() на getISO3Country() для получить 3-буквенный код ISO для страны. Это позволит получить название страны:

 String locale = context.getResources().getConfiguration().locale.getDisplayCountry();

Это кажется проще, чем другие методы, и зависит от настроек локализации на телефоне, поэтому, если пользователь из США находится за границей, он, вероятно, все еще хочет Фаренгейта, и это сработает :)

Примечание редактора. Это решение никак не связано с местоположением телефона. Это постоянно. Когда вы отправляетесь в Германию, локаль НЕ изменится. Короче говоря: локаль != местоположение.

person stealthcopter    schedule 07.09.2010
comment
Это не будет работать в странах, для которых у Android нет локали. Например, в Швейцарии язык, скорее всего, будет установлен на немецкий или французский. Этот метод даст вам Германию или Францию, а не Швейцарию. Лучше использовать подход LocationManager или TelephonyManager. - person MathewI; 21.11.2011
comment
Плохо работает. Я должен различать страну пользователя для всех стран Латинской Америки, все телефоны для тестирования вернулись в США, даже если телефон на английском или испанском языке. - person htafoya; 27.06.2012
comment
Это не отвечает на название вопроса. У меня может быть настроен английский язык в телефоне, и я могу находиться в любой точке мира (мой родной язык не английский, но мой телефон находится настроен на (британский) английский язык. Тем не менее, это отвечает на реальный вопрос, потому что пользователю нужны единицы США, если он гражданин США, где бы он ни находился в данный момент. - person Jan Hudec; 01.08.2013
comment
Это не сработает в таких странах, как Швейцария, как заметил Мэтьюл. - person DNax; 07.11.2013
comment
Невозможное решение для получения названия страны - person Aamirkhan; 27.01.2014
comment
Это нехорошие вопросы. Именно, если я хочу знать страну, потому что я хочу знать, переместился ли пользователь или он находится не в обычном месте... - person Sotti; 11.05.2014
comment
В целом это хороший ответ, но он возвращает только страну региона, а не фактическую страну. - person dst; 04.06.2014
comment
Этот код возвращает US, но не дает текущего названия/кода страны - person silverFoxA; 15.04.2015
comment
Этот код получает конфигурацию телефона, а не местоположение пользователя - person Davide; 12.02.2016
comment
Это не работает все время. Я получаю пустую строку на некоторых устройствах - person Chisko; 15.09.2016
comment
context.getResources().getConfiguration().locale устарела - person Mike6679; 29.03.2017
comment
Ненадежная, не общепризнанная и просто плохая практика. Пожалуйста, не используйте этот код. - person Firzen; 15.05.2019
comment
это не работает, он возвращает код на основе языка устройства - person user2934536; 27.05.2019
comment
Спасибо. я тоже пробовал этот, но он всегда возвращает США - person Manideep; 03.03.2021

Используйте эту ссылку http://ip-api.com/json, это предоставит всю информацию в виде json . Из этого json вы можете легко получить страну. Этот сайт работает с вашим текущим IP-адресом, он автоматически определяет IP-адрес и детали отправки.

Документы 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"
}

примечание: поскольку это стороннее решение, используйте его только в том случае, если другие не сработали.

person shine_joseph    schedule 05.11.2014
comment
Я не уверен, что это именно то, чего хотел ОП, но мне все равно очень нравится ответ. - person JohnnyLambada; 16.01.2015
comment
Нравится ответ, так как это будет работать и на планшетах (без сима). Решение для телефонии работает только на телефонах с активными симками. Телефоны с двумя SIM-картами — еще один проблемный сценарий, поскольку они могут быть из разных стран. Так что, вероятно, имеет смысл полагаться на IP-решение, упомянутое выше. - person Manish Kataria; 22.04.2015
comment
Несмотря на то, что, как вы указали, это может быть не лучший подход к проблеме, на самом деле он обеспечивает правильное решение. +1 от меня и спасибо! - person Matteo; 28.04.2016
comment
Всегда плохо использовать третьи стороны, вы никогда не можете знать, насколько они стабильны. например - Парс. - person Nativ; 22.05.2016
comment
Ага. Вот почему это не рекомендуемое решение. Но это простой подход. - person shine_joseph; 23.05.2016
comment
но у него есть ограничения. их система автоматически блокирует любые IP-адреса, выполняющие более 150 запросов в минуту. - person Ram Mandal; 15.07.2016
comment
Мне нравится подход, но как я могу это проверить?? - person Arpit Patel; 03.09.2016
comment
Что вы подразумеваете под тестом? вы можете реализовать это как обычные веб-сервисы и проанализировать данные. Но поскольку это стороннее решение, вы должны попробовать все другие варианты, упомянутые выше. - person shine_joseph; 05.09.2016
comment
Это то, что я хотел - person Harvinder Singh; 27.09.2019
comment
Это хорошо, но вам нужно подключение к Интернету, чтобы это работало. - person Mohit Atray; 20.02.2020
comment
Спасибо, это работает, но есть ограничения. Они не разрешают коммерческое использование бесплатной конечной точки, их конечные точки ограничены 45 HTTP-запросами в минуту с IP-адреса (иначе запросы будут регулироваться (HTTP 429) до сброса окна ограничения скорости). - person CoolMind; 04.03.2021
comment
Как они узнают, используем ли мы бесплатный уровень в коммерческих целях? - person Aaditya Paliwal; 29.03.2021

На самом деле я только что узнал, что есть еще один способ получить код страны, используя метод getSimCountryIso() для TelephoneManager:

TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
String countryCode = tm.getSimCountryIso();

Поскольку это код сим-карты, он также не должен меняться при поездках в другие страны.

person DonGru    schedule 07.09.2010
comment
Это может не работать, если в устройстве нет SIM-карты, например в планшете. - person thomasdao; 15.03.2013

Во-первых, получите LocationManager. Затем позвоните LocationManager.getLastKnownPosition. Затем создайте GeoCoder и вызовите GeoCoder.getFromLocation. Сделайте это в отдельной теме!! Это даст вам список Address объектов. Позвони Address.getCountryName и ты понял.

Имейте в виду, что последняя известная позиция может быть немного устаревшей, поэтому, если пользователь только что пересек границу, вы можете некоторое время об этом не знать.

person EboMike    schedule 07.09.2010
comment
Для этого приложения изменение единицы измерения по умолчанию нежелательно при перемещении стран, поскольку предпочтения пользователя в градусах Цельсия или Фаренгейта не изменятся, когда он отважится отправиться в новые земли. - person stealthcopter; 07.09.2010
comment
Мне нужно знать, в какой стране находится мой пользователь для вызова API. Вызов возвращает местоположения в окрестностях. Поэтому меня интересует только реальный код страны, в которой сейчас находится пользователь. Просто чтобы дать представление о том, для чего может понадобиться описанный выше подход. - person vinzenzweber; 07.03.2011
comment
Это очень недооцененный ответ, но факт в том, что это самое надежное решение. Большинство из вышеперечисленных ответов не работают для сети Wi-Fi. Предоставленный @shine_joseph выглядит хорошо, но предоставленный API не предназначен для коммерческого использования. - person Gem; 04.07.2016
comment
Используйте с осторожностью. Ваше устройство предоставит вам местоположение, даже если оно не подключено к сети, но геокодер обычно возвращает нуль для массива адресов, если Wi-Fi отключен, вызывая исключение, которое вам нужно будет попробовать/отловить. - person Mike Critchley; 08.12.2018
comment
Но одна загвоздка в том, что нам нужно запросить разрешение во время выполнения для доступа к COARSE_LOCATION, верно? - person Tianyao Chen; 14.12.2020

Вот полное решение, основанное на LocationManager и в качестве запасных вариантов на TelephonyManager и местоположениях сетевого провайдера. Я использовал приведенный выше ответ от @Marco W. для запасной части (отличный ответ сам по себе!).

Примечание: код содержит PreferencesManager, это вспомогательный класс, который сохраняет и загружает данные из SharedPrefrences. Я использую его, чтобы сохранить страну в SP, я получаю страну только в том случае, если она пуста. Для моего продукта меня не волнуют все крайние случаи (пользователь путешествует за границу и так далее).

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);
        }
        if (location == null) {
            log.w("Couldn't get location from network and gps providers")
            return
        }
        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;
}
person Nativ    schedule 22.05.2016
comment
Извините, но ваш ответ действительно нужно переписать. Код содержит много непригодного кода. - person ichalos; 12.04.2017
comment
@ichalos или ты не понял логики. Пожалуйста, дайте мне 1 пример неиспользуемого кода в этом фрагменте - person Nativ; 12.04.2017
comment
Конечно, я не понял логики, и, пожалуйста, не поймите меня неправильно. Я имею в виду, что PipplApp, PrefernecesManager и т. д. можно было бы удалить, и предлагаемое решение могло бы быть более понятным для читателей. - person ichalos; 12.04.2017
comment
@ichalos насчет PiplApp Согласен с вами на 100%, просто удаляю - person Nativ; 12.04.2017
comment
В вашем коде есть country = addresses.get(0).getCountryName();, который поместит полное название страны в переменную country. В то же время в методе getCountryBasedOnSimCardOrNetwork(Context context) вы возвращаете ISO-код страны. Я полагаю, что вы хотели написать country = addresses.get(0).getCountryCode(); :-) - person Firzen; 16.05.2019
comment
@Nativ Местоположение, указанное вами у сетевого провайдера, никогда не используется. - person Charles; 21.08.2019
comment
@Charles используется ... он присваивает значение переменной местоположения, которая позже используется в коде. - person Nativ; 22.08.2019
comment
@Nativ, но в том-то и дело. Строго говоря, данный метод выше, местоположение является локальной переменной для метода. Поэтому его нельзя использовать позже в коде. Для дальнейшего пояснения, я не говорю о первом присвоении переменной. Я говорю о присваивании в условии if. Вы проверяете, является ли местоположение нулевым. Если это так, попробуйте установить его снова. Тогда только в другом вы применяете некоторую логику с местоположением. поэтому, если первое назначение местоположения привело к нулю, второе назначение может работать, но никогда не будет использоваться. - person Charles; 22.08.2019

Вы можете использовать getNetworkCountryIso() from TelephonyManager для получения страны телефон в настоящее время находится в сети (хотя, видимо, это ненадежно в сетях CDMA).

person Dave Webb    schedule 07.09.2010
comment
это звучит довольно прямолинейно и хорошо работало в эмуляторе в первую очередь - не могли бы вы просто объяснить, почему это ненадежно в сетях CDMA? - person DonGru; 07.09.2010
comment
ах ладно, я понял - потому что так написано в документации :) - person DonGru; 07.09.2010
comment
Из-за приложения это не будет лучшим решением, поскольку, когда пользователь путешествует за границу, его единица измерения по умолчанию изменится. Было бы разумнее иметь статическую единицу измерения по умолчанию, основанную на настройках локали телефона, которую затем, конечно, можно где-то изменить в настройках. - person stealthcopter; 07.09.2010

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;
}
person 4gus71n    schedule 21.04.2017
comment
Требуется ли разрешение и какую страну он показывает? - person CoolMind; 19.04.2019

Для некоторых устройств, если язык по умолчанию установлен другой (индиец может установить английский (США)), то

context.getResources().getConfiguration().locale.getDisplayCountry();

даст неправильное значение. Так что этот метод ненадежен

Кроме того, метод getNetworkCountryIso() в TelephonyManager не будет работать на устройствах без SIM-карты (планшеты WIFI).

Если на устройстве нет SIM-карты, мы можем использовать часовой пояс, чтобы узнать страну. Для таких стран, как Индия, этот метод будет работать

пример кода, используемый для проверки того, является ли страна Индией или нет (идентификатор часового пояса: asia/calcutta)

private void checkCountry() {


    TelephonyManager telMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
    if (telMgr == null)
        return;

    int simState = telMgr.getSimState();

    switch (simState) {
        //if sim is not available then country is find out using timezone id
        case TelephonyManager.SIM_STATE_ABSENT:
            TimeZone tz = TimeZone.getDefault();
            String timeZoneId = tz.getID();
            if (timeZoneId.equalsIgnoreCase(Constants.INDIA_TIME_ZONE_ID)) {
               //do something
            } else {
               //do something
            }
            break;

            //if sim is available then telephony manager network country info is used
        case TelephonyManager.SIM_STATE_READY:

           TelephonyManager tm = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
            if (tm != null) {
                String countryCodeValue = tm.getNetworkCountryIso();
                //check if the network country code is "in"
                if (countryCodeValue.equalsIgnoreCase(Constants.NETWORK_INDIA_CODE)) {
                   //do something
                }

                else {
                   //do something
                }

            }
            break;

    }
}
person MarGin    schedule 26.10.2018
comment
хорошая идея, но часовой пояс не является особенностью страны, вы знаете это, верно? На каждые 15 градусов меридианов приходится другой часовой пояс и т.д. - person Gunhan; 13.02.2019
comment
@Gunhan, часовые пояса, возвращаемые Android, в основном не пересекают границы страны. См. список в Википедии. Однако есть некоторые исключения, которые усложняют сопоставление. - person riwnodennyk; 08.01.2021

Используя GPS с широтой и долготой, мы можем получить код страны.

Если мы используем телефонию, она не будет работать, если мы не используем сим-карту, а в локали, в зависимости от языка, код страны отображается неправильно.

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;
    }

}

Журнал:

E/код страны: IN

Изменить: использовать Fused Location Provider, чтобы получить широту. и обновление долготы для лучшего результата.

person Steve    schedule 12.08.2016
comment
Что такое gpsParty()? это не определено - person Nikola C; 28.11.2017

person    schedule
comment
Работает только на телефонах или других устройствах с сим-картой. При использовании на планшете WIFI вы получите нуль. Так что его полезность ограничена. - person Bram; 31.08.2015
comment
@Bram Это все, что ты можешь получить. Так что это на самом деле очень полезно, проблема только в том, что у вас нет других надежных источников данных, если у вас есть планшет только с WiFi. - person caw; 27.10.2015
comment
Обратите внимание: если пользователь из США находится в отпуске во Франции, getSimCountryIso скажет us, а getNetworkCountryIso скажет fr. - person Tim; 06.04.2016
comment
Вы можете изменить вызов toLowerCase() на toUpperCase(). - person toobsco42; 19.05.2016
comment
Мне нужен код, а не кодовое имя; лайк для сша +1 не сша - person Shihab Uddin; 03.12.2016
comment
Пожалуйста, не catch (Exception e). - person tango whiskey double; 19.10.2017
comment
Если вам не нужен нуль, вы можете вместо этого вернуть страну из текущей локали, чтобы получить хотя бы что-нибудь - person Leo Droidcoder; 24.12.2017
comment
@LeoDroidcoder Страна из текущего региона может быть гораздо менее точной (или даже вообще не точной). Это ослабляет гарантию, которую дает этот метод, потому что вы не знаете, получили ли вы только что код страны с SIM-карты или менее точную информацию из региона. Если вы согласны с этим и имейте это в виду, ваше решение в порядке. - person caw; 28.12.2017
comment
Имейте в виду, что getSimCountryIso и getNetworkCountryIso могут возвращать пустую строку. - person Aba; 28.03.2019