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

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

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

Методы

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

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

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

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

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

Solutions Collecting From Web of "Надежный метод получения страны, в которой находится пользователь?"

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

 TelephonyManager.getNetworkCountryIso() 

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

 TelephonyManager.getSimCountryIso() 

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

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

Попробуй это:

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

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

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

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

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

 mTelephonyManager.getSimCountryIso() 

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