Надежный способ получить страну, в которой находится пользователь?
Обычно я получаю страну на языке устройства. Это работает, но теперь я должен признать Бразилию. И большинство устройств имеют только португальский (pt_PT) и не португальский (Бразилия) вариант.
Я проверил эту тему: Где я? - Получить страну
Методы
String locale = context.getResources().getConfiguration().locale.getCountry();
String locale = context.getResources().getConfiguration().locale.getDisplayCountry();
Являются ли все еще языковыми, не помогают.
Есть также предложение с сим-картой, но я не уверен, что это будет работать надежно (все ли сим-карты имеют эту уникальную идентификацию?), это также немного не совсем то, что мне нужно, потому что пользователь может " t изменить его (что имеет место, если это была настройка), и это исключает пользователей, использующих устройство без сим-карты (возможно, они просто используют WLAN).
Там также предлагается предложение геолокации, но это, вероятно, не будет работать на устройствах, которые его дезактивировали. Или я не прав?
Если ничего другого не помогает, я бы сделал диалог или настройку меню в своем приложении, чтобы пользователь мог выбрать его там. Но сначала я хотел бы подтвердить, есть ли какие-либо надежные возможности с устройством.
Ответы
Ответ 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();
}
............................