android - programacion - ¿Método confiable para obtener el país en el que se encuentra el usuario?
manual android studio avanzado (5)
Está trabajando en mí.
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();
}
............................
Normalmente obtengo el país desde el idioma del dispositivo. Funciona pero ahora tengo que reconocer a Brasil. Y la mayoría de los dispositivos solo tienen opción en portugués (pt_PT) y no en portugués (Brasil).
Revisé este hilo: ¿Dónde estoy? - Obtener país
Los métodos
String locale = context.getResources().getConfiguration().locale.getCountry();
String locale = context.getResources().getConfiguration().locale.getDisplayCountry();
Todavía son solo de idioma, no ayuda.
También está la sugerencia con la tarjeta SIM, pero no estoy seguro de si esto funcionará de manera confiable (¿todas las tarjetas SIM tienen esta identificación única?), Tampoco es exactamente lo que necesito porque el usuario no puede cambiarla. (que es el caso si se tratara de una configuración), y excluirá a los usuarios que usen un dispositivo sin tarjeta SIM (quizás solo usen WLAN).
También existe una sugerencia de geolocalización, pero es probable que esto no funcione en dispositivos que la hayan desactivado. ¿O me equivoco?
Si nada más me ayuda, haría un diálogo o configuración de menú en mi aplicación para que el usuario pueda seleccionarla allí. Pero primero me gustaría confirmar si hay alguna posibilidad confiable con el dispositivo.
La geolocalización sería la más efectiva y discreta. Siempre puede utilizar la geolocalización, y si el usuario la tiene desactivada, mostrará su cuadro de diálogo preguntando por su país. Cuanto menos moleste al usuario para obtener información, mejor.
Prueba esto:
TelephonyManager teleMgr = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
if (teleMgr != null){
countryISOCode = teleMgr.getSimCountryIso();
}
Ahora, countryISOCode
contendría uno de los siguientes códigos de país similares a ISO 3166 según esta entry Wikipedia.
Puede extraer la ubicación de la red telefónica :
TelephonyManager.getNetworkCountryIso()
TelephonyManager.getSimCountryIso()
O, si tiene el número de teléfono del usuario , es posible que pueda relacionarlo con el país a través de estos datos .
Idealmente, podría usar los tres (en algún orden, quizás SIM, número de teléfono, luego red), y si ninguno funciona, use la geolocalización inversa como último recurso.
TelephonyManager mTelephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
mTelephonyManager.getNetworkCountryIso();
Según lo respondido por Eric, el código anterior es el mejor enfoque. También vale la pena señalar que,
mTelephonyManager.getSimCountryIso()
no debe usarse ya que esto indicaría el país de origen del proveedor de SIM (por ejemplo, un Vodaphone UK SIM devolvería "gb", un Vodaphone Alemania SIM devolvería "de") y no la ubicación actual (País) del dispositivo. Esta diferencia es significativa cuando el usuario está en roaming.