Подтвердить что ты не робот

Надежный способ получить страну, в которой находится пользователь?

Обычно я получаю страну на языке устройства. Это работает, но теперь я должен признать Бразилию. И большинство устройств имеют только португальский (pt_PT) и не португальский (Бразилия) вариант.

Я проверил эту тему: Где я? - Получить страну

Методы

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

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

Являются ли все еще языковыми, не помогают.

Есть также предложение с сим-картой, но я не уверен, что это будет работать надежно (все ли сим-карты имеют эту уникальную идентификацию?), это также немного не совсем то, что мне нужно, потому что пользователь может " t изменить его (что имеет место, если это была настройка), и это исключает пользователей, использующих устройство без сим-карты (возможно, они просто используют WLAN).

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

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

4b9b3361

Ответ 1

Вы можете вывести местоположение из телефонной сети:

TelephonyManager.getNetworkCountryIso()

Или с SIM-карты:

TelephonyManager.getSimCountryIso()

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

В идеале вы можете использовать все три из них (в некотором порядке, возможно, SIM, Phone #, затем Network), и если они не работают, используйте обратную геолокацию в качестве последнего средства.

Ответ 2

Попробуйте следующее:

 TelephonyManager teleMgr = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
 if (teleMgr != null){
     countryISOCode = teleMgr.getSimCountryIso();
 }

Теперь countryISOCode будет содержать одно из следующих значений, похожее на коды стран ISO 3166, согласно этой статье Wikipedia .

Ответ 3

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

Ответ 4

TelephonyManager mTelephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
mTelephonyManager.getNetworkCountryIso();

Как ответил Эрик, приведенный выше код - лучший подход. Также стоит отметить, что

mTelephonyManager.getSimCountryIso()

не следует использовать, поскольку это указывает на страну происхождения поставщика SIM-карты (например, Vodaphone UK SIM вернет "gb", A Vodaphone Germany SIM вернет "de" ), а не текущее местоположение (страна) устройство. Эта разница существенна, когда пользователь перемещается.

Ответ 5

Это работает на меня.

String countryISOCode;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    TelephonyManager teleMgr = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
    if (teleMgr != null){
        countryISOCode = teleMgr.getSimCountryIso();
    }

............................