2009-05-20 33 views
44

La única forma que he encontrado de recuperar MCC y MNC es anulando método onConfigurationChanged de una actividad, tales como:¿cómo se obtiene el MCC y el MNC del teléfono en Android?

public void onConfigurationChanged(Configuration config) 
{ 
    super.onConfigurationChanged(config); 
    DeviceData.MCC = "" + config.mcc; 
    DeviceData.MNC = "" +config.mnc; 
} 

Sin embargo, necesito estos datos tan pronto como se inicia la aplicación y no se puede esperar a que el usuario para cambiar la orientación del teléfono o equivalente para activar este método. ¿Hay una mejor manera de acceder al objeto de configuración actual?

Respuesta

77

El TelephonyManager tiene un método para devolver el MCC + MNC como una cadena (getNetworkOperator()) que le hará lo que quiera. Puede obtener acceso a él a través:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    TelephonyManager tel = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 
    String networkOperator = tel.getNetworkOperator(); 

    if (!TextUtils.isEmpty(networkOperator)) { 
     int mcc = Integer.parseInt(networkOperator.substring(0, 3)); 
     int mnc = Integer.parseInt(networkOperator.substring(3)); 
    } 
} 
+0

cómo resolver el nombre del operador de – Trikaldarshi

+6

'getNetworkOperator()' devolverá una cadena vacía si no se ha insertado una tarjeta SIM. Entonces la condición 'if' debe contener'! NetworkOperator.isEmpty() '.Lo probé en mi Nexus 5 –

+1

Además, fallará en el caso de MVNO –

4

Puede acceder a la configuración actual getResources().getConfiguration() hace el truco.

1

Bien, resulta que getResources(). GetConfiguration(). Mcc truco es probablemente mejor para la mayoría de los propósitos, porque con el otro si la persona pone su teléfono en modo avión o utiliza Wi-Fi, entonces devuelve un MCC vacío.

16

¿Sabe que hay dos MCC/MNC para un teléfono activo? (Uno de ellos es el código de país y el ID de soporte para la tarjeta SIM, el otro es para la torre de red/célula en uso.)

Si el getResources().getConfiguration().mcc no está vacío en modo avión, que es el valor SimTelephonyManager.getSimOperator(), no el tower valor TelephonyManager.getNetworkOperator().

No sé cuál es el OP deseado, pero Answer 3 le dará resultados diferentes que su código original si el getConfiguration es realmente el Sim valores.

+0

¿Cuál es la diferencia entre getNetworkOperator() y getSimOperator(); – rup35h

4

getResources().getConfiguration().mcc es una mala elección porque devuelve un número entero, por lo tanto, compromete valores válidos como 01 o 044. Claramente, el número entero no es una buena opción para esto.

ver detalles en Mobile_Network_Code

Actualización: en Australia, se verificó un caso mal aquí. El getNetworkOperator devuelve un valor diferente de getSimOperator, donde este último es correcto.

ver detalles en el documento Android: TelephonyManager

2

descubrí que el operador de red puede ser a veces como [email protected] cuando no está conectado al operador (servicio no disponible) incluso si no hay una tarjeta SIM insertada una. Esto sucedió en Samsung S2 con Android 4.1.2.

enter image description here

Así que hay que tener cuidado cuando se convierte a int.

int mcc = Integer.parseInt(networkOperator.substring(0, 3)); 
0

esta se actualiza. utilizar este

TelephonyManager tel = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 
    String networkOperator = tel.getSimOperator(); 
    System.out.println("************mnc,mcc"+networkOperator); 
    if (!TextUtils.isEmpty(networkOperator)) { 
     mcc = networkOperator.substring(0, 3); 
     mnc = networkOperator.substring(3);System.out.println("************mnc,mcc"+mnc+mcc); 
    }mnc_mcc.setText("************mnc,mcc"+mnc+","+mcc); 
} 
Cuestiones relacionadas