2016-08-02 31 views
2

Ich versuche, die mcc und mnc nach einem SIM LOADED Zustand, um zu überprüfen, ob die SIM-Karte wechseln zu bekommen hat, ohne READ PHONE STATE Berechtigungen, um die App-Anfragen für einige Netzwerke und in einigen Ländern zu deaktivieren dass der Benutzer nicht will.Android MCC und MNC

Da sich getSimOperator() je nach aktuellem Netzbetreiber ändern kann (z. B. wenn der Benutzer im Roaming ist oder nicht), habe ich mich entschieden, getNetworkOperator() zu verwenden.

Obwohl diese Methode null auch dann zurückgeben kann, wenn die SIMLOADED ist und unterschiedliche Ergebnisse z. Eine Lycamobile-Karte mit nur GSM-Verbindung gibt mir mnc = 01 und wenn ich die SIM-Karte herausnehme und wieder einlege, bekomme ich mnc = 04.

Weiß jemand, warum die Mnc unterschiedliche Ergebnisse für die getNetworkOperator() gibt? Welche Methode ist besser, getNetworkOperator() oder getSimOperator() für diesen Fall?

Auch kann ich getResources().getConfiguration().mcc nicht verwenden, weil es eine int-Nummer gibt, die die 0 vor z. gibt 4 anstelle von 04.

Dies ist mein Code, um eine SIM-Statusänderung zu überprüfen:

@Override 
public void onReceive(final Context context, Intent intent) { 
    if (intent != null) { 

     Bundle extras = intent.getExtras(); 

     if (extras != null) { 
      String ss = extras.getString(EXTRAS_SIM_STATUS); 
      if (ss != null && (ss.equals("LOADED"))) { 
       TelephonyManager telephonyManager = ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)); 
       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && hasPermissions(READ_PHONE_STATE)) { 
        //here I get the imsi 
       }else{ 
        L.d("NetworkOperator result %s", telephonyManager.getNetworkOperator()); 
        //saving in shared preferences in order to check if the sim is allowed or not 
        //this is also called on application onCreate() so I can check the current SIM 
       } 
      } 
     } 
    } 
} 

PS: die SIM-Karte, die ich nur GSM-Verbindung bin hat. Auch habe ich versucht mit einer anderen Karte (mit 4g Fähigkeiten) und alles funktioniert wie erwartet mnc ist das gleiche 01 für eine Vodafone-Karte.

+1

Ich glaube, Sie haben dies: 'Da getSimOperator() entsprechend den aktuellen Träger ändern kann (beispielsweise wenn der Benutzer über das Roaming oder nicht ist) ich das getNetworkOperator verwenden entschieden()' rückwärts.. getSimOperator sollte sich mit der SIM ändern - aber nicht beim Roaming usw. – alzee

+0

ich dachte es wäre genau andersherum, gehe auf den Emulator testen und ich werde dann zu dir zurückkommen, danke;) – iGoDa

+0

Danke, es war was du sagten, getSimOperator() kommt von der Simcard – iGoDa

Antwort

13

Lassen Sie mich einige Informationen mit Ihnen teilen .. Es kann helfen.

MCC, MNC, PLMN

Zuerst Sie MCC und MNC verstehen müssen:

MCC - Mobile Country Code
Dies ist der Ländercode. Es hat immer 3 Ziffern. Einige Länder können mehr als ein Kundencenter verwenden.

MNC - Mobiler Netzwerkcode
Dies ist der Netzwerkcode. Es kann 2 oder 3 Ziffern haben.

MCCMNC - PLMN-Nummer.

Diese Nummern werden verwendet, um einen Träger von einem anderen zu unterscheiden.

Zum Beispiel können Sie eine Liste an www.mcc-mnc.com überprüfen:

AT & T in US folgende PLMN Nummer hat:

MCC = 310 
MNC = 410 
PLMN = 310410 

Telefonica in Brasilien zum Beispiel hat folgende PLMN-Nummer:

MCC = 724 
MNC = 10 
PLMN = 72410 

Basierend auf den obigen Informationen können wir uns vorstellen, dass wir PLMNs mit 5 oder 6 Ziffern haben.

Da MNC 2 oder 3 Ziffern haben kann, glaube ich Ihnen die MNC-Nummer abrufen können wie folgt (zu wissen, dass MCC hat immer 3-stellig):

String plmn = "33402"; // OR 334020 
String mcc = plmn.substring(0,3); 
String mnc = plmn.substring(3,plmn.length()); 
System.out.println("plmn[" + plmn + "] mcc[" + mcc + "] mnc[" + mnc + "]"); 

Alle Träger in demselben Land teilt die gleichen MCC-Nummern . In einigen Ländern gibt es mehr als ein MCC ... Aber selbst dann verwenden alle Fluggesellschaften in diesem Land ein solches MCC.

Also, wenn Sie den Standort einiger Träger überprüfen möchten, müssen Sie seine MCC lesen (und nie seine MNC).

SIM und Netzwerk

One Informationen in der Simkarte gespeichert ist, dass PLMN-Nummer. Die PLMN-Nummer wird von ihrer IMSI abgerufen. Seine PLMN-Nummer sind die ersten 5 oder 6 Ziffern seiner IMSI.

Auf diese Weise können Sie bestimmen, welcher Träger diese SIM-Karte besitzt.

Auf der anderen Rand, Broadcast der Network Tower auch seine PLMN.

Auf diese Weise kann ein Gerät jedes Mal nach seinem HOME-Netzwerk suchen, wenn Sie das Gerät neu starten (oder an einen anderen Ort verschieben).

HOME vs ROAMING

Startseite Situation ist, wenn PLMN Anzahl der Simkarte das gleiche von der aktuellen registrierten Netzwerk ist.

Roaming ist, wenn die SIM-Karte ein anderes PLMN als die registrierte Zelle hat.

Natürlich haben einige Carrier mehr als eine PLMN-Nummer und das Telefon sollte in diesen Situationen als HOME gelten. Aber das ist eine andere Geschichte.

Schließlich getSimOperator() und getNetworkOperator()

getSimOperator() Diese Methode gibt MCCMNC (PLMN) von SIMCard

getNetworkOperator() Diese Methode gibt MCCMNC (PLMN) von aktuellen Träger

lagerten Es liegt bei Ihnen

Jetzt wissen Sie den Unterschied zwischen Eine Simkarte und ein Netzwerkbetreiber. Sie müssen also entscheiden, wie Sie Ihre App blockieren/zulassen.

  • Wenn Sie blockieren, indem getSimOperator() Sie die Simkarten aus einem bestimmten Land blockieren. Auf diese Weise bleibt die registrierte Zelle gesperrt, selbst wenn der Benutzer in ein Land mit aktivierter Funktion reist.

  • Wenn Sie blockieren durch getNetworkOperator() blockieren Sie die Funktion in bestimmten Netzwerken/Contries. Auf diese Weise kann der Benutzer, der die App verwenden kann, Probleme haben, wenn er in ein Land reist, in dem die Funktion blockiert ist.

+1

Kennzeichnung als richtig, weil ziemlich gut meine Zweifel in der Sache geklärt, danke! – iGoDa