簡介:
IMSI:international mobiles subscriber identity國際移動用戶號碼標識,
這個一般大家是不知道,GSM必須寫在卡內相關文件中;
MSISDN:mobile subscriber ISDN用戶號碼,這個是我們說的139,136那個號碼;
ICCID:ICC identity集成電路卡標識,這個是唯一標識一張卡片物理號碼的;
IMEI:international mobile Equipment identity手機唯一標識碼;
IMSI 全稱為 International Mobile Subscriber Identity,中文翻譯為國際移動用戶識別碼。
它是在公眾陸地移動電話網(PLMN)中用於唯一識別移動用戶的一個號碼。在GSM網絡,這個號碼通常被存放在SIM卡中。
IMSI共有15位,其結構如下:
MCC+MNC+MIN MCC:Mobile Country Code,移動國家碼,共3位,中國為460; MNC:Mobile Network Code,移動網絡碼,共2位,電信03,移動02,聯通GSM 01,一個典型的IMSI號碼為460030912121001; MIN共有10位,其結構如下: 09+M0M1M2M3+ABCD 其中的M0M1M2M3和MDN號碼中的H0H1H2H3可存在對應關系,ABCD四位為自由分配。 可以看出IMSI在MIN號碼前加了MCC,可以區別出每個用戶的來自的國家,因此可以實現國際漫游。在同一個國家內,如果有多個CDMA運營商,可以通過MNC來進行區別.
IMEI 全稱為 International Mobile Equipment Identity,
中文翻譯為國際移動裝備辨識碼, 即通常所說的手機序列號,用於在手機網絡中識別每一部獨立的手機,
是國際上公認的手機標志序號,相當於移動電話的身份證。序列號共有15位數字,前6位(TAC)是型號核准號碼,
代表手機類型。接着2位(FAC)是最后裝配號,代表產地。后6位(SNR)是串號,代表生產順序號。最后1位(SP)一般為0,
是檢驗碼,備用。國際移動裝備辨識碼一般貼於機身背面與外包裝上,同時也存在於手機記憶體中,通過輸入*#06#即可查詢。
Android中獲取IMSI和IMEI的代碼很簡單,如下:
================================================================================
TelephonyManager mTelephonyMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); String imsi = mTelephonyMgr.getSubscriberId(); String imei = mTelephonyMgr.getDeviceId(); Log.i("IMSI", imsi); Log.i("IMEI", imei);
android 獲取sim卡運營商信息
TelephonyManager tm = (TelephonyManager)Context.getSystemService(Context.TELEPHONY_SERVICE);
TelephonyManager 的使用 TelephonyManager 提供設備上獲取通訊服務信息的入口,應用程序使用這個類的方法來獲取電話的服務商或者狀態。程序也可以注冊一個監聽器來監聽電話狀態的改變。 不需要直接實例化這個類,使用Context.getSystemService(Context.TELEPHONY_SERVICE)來獲取這個類的實例。
注意:一些電話信息需要相應的權限。 方法無效
getSimOperatorName() Returns the Service Provider Name (SPN). // 獲取服務提供商名字,比如電信,聯通,移動 用下面的方法 第一種方法: 獲取手機的IMSI碼,並判斷是中國移動/中國聯通/中國電信
TelephonyManager telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
/** 獲取SIM卡的IMSI碼
* SIM卡唯一標識:IMSI 國際移動用戶識別碼(IMSI:International Mobile Subscriber Identification Number)是區別移動用戶的標志,
* 儲存在SIM卡中,可用於區別移動用戶的有效信息。IMSI由MCC、MNC、MSIN組成,其中MCC為移動國家號碼,由3位數字組成,
* 唯一地識別移動客戶所屬的國家,我國為460;MNC為網絡id,由2位數字組成,
* 用於識別移動客戶所歸屬的移動網絡,中國移動為00,中國聯通為01,中國電信為03;
MSIN為移動客戶識別碼,采用等長11位數字構成。
*唯一地識別國內GSM移動通信網中移動客戶。所以要區分是移動還是聯通,只需取得SIM卡中的MNC字段即可
*/
String imsi = telManager.getSubscriberId(); if(imsi!=null){ if(imsi.startsWith(“46000″) || imsi.startsWith(“46002″)) {//因為移動網絡編號46000下的IMSI已經用完,所以虛擬了一個46002編號,134/159號段使用了此編號 //中國移動 }else if(imsi.startsWith(“46001″)){ //中國聯通 }else if(imsi.startsWith(“46003″)){ //中國電信 } }
根據ICCID區分 省份 詳細介紹
功能 說明
getCellLocation() 返回的單元格位置的裝置 ACCESS_COARSE_LOCATION或ACCESS_FINE_LOCATION
getDeviceId() 返回的IMEI / MEID的設備。 如果該設備是GSM設備 然后IMEI號將被退回,如果該設備是一個CDMA設備然后MEID 將被退回 READ_PHONE_STATE
getLine1Number() 返回設備的電話號碼(MSISDN號碼) READ_PHONE_STATE
getNetworkOperatorName() 返回注冊的網絡運營商的名字
getNetworkOperator() 返回的MCC +跨國公司的注冊網絡運營商
getNetworkCountryIso() 返回注冊的網絡運營商的國家代碼
getSimCountryIso() 返回SIM卡運營商的國家代碼 READ_PHONE_STATE
getSimOperator() 返回SIM卡運營商的單個核細胞數+冶 READ_PHONE_STATE
getSimOperatorName() 返回SIM卡運營商的名字 READ_PHONE_STATE
getSimSerialNumber() 返回SIM卡的序列號 READ_PHONE_STATE
getNetworkType() 返回網絡設備可用的類型。 這將是 下列其中一個值:
TelephonyManager.NETWORK_TYPE_UNKNOWN TelephonyManager.NETWORK_TYPE_GPRS TelephonyManager.NETWORK_TYPE_EDGE TelephonyManager.NETWORK_TYPE_UMTS READ_PHONE_STATE getPhoneType() 返回設備的類型。 這將是以下值之一: TelephonyManager.PHONE_TYPE_NONE TelephonyManager.PHONE_TYPE_GSM TelephonyManager.PHONE_TYPE_CDMA READ_PHONE_STATE getSubscriberId() 返回用戶識別碼(的IMSI)的設備 READ_PHONE_STATE
getNeighboringCellInfo() 返回NeighboringCellInfo類代表名單 相鄰小區的信息,如果可用,否則將 返回null ACCESS_COARSE_UPDATES
詳細的源碼如下:
import java.io.BufferedReader; import java.io.FileReader; import java.util.HashMap; import java.util.Map; import android.app.Activity; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Build; import android.telephony.TelephonyManager; import android.util.Log; /** * 獲取手機信息的工具類 * @author Javen * */ public class PhoneHelper { private static PhoneHelper mPhoneHelper; private TelephonyManager tm; private Context mContext; private PhoneHelper (Context context){ mContext=context; tm=(TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); } public static PhoneHelper getInstance(Context context){ if (mPhoneHelper==null) { synchronized (PhoneHelper.class) { if (mPhoneHelper==null) { mPhoneHelper=new PhoneHelper(context); } } } return mPhoneHelper; } /** * 獲取手機型號 * @return */ public static String getModel() { return android.os.Build.MODEL; } /** * Firmware/OS 版本號 * @return */ public static String getVersionRelease() { return android.os.Build.VERSION.RELEASE; } /** * SDK版本號 * @return */ public static int getSdkApi() { return android.os.Build.VERSION.SDK_INT; } /** * 獲取手機屏幕分辨率 * @param activity * @return */ public static String DisplayMetrics(Activity activity){ android.util.DisplayMetrics dm=new android.util.DisplayMetrics(); activity.getWindowManager().getDefaultDisplay().getMetrics(dm); //獲得手機的寬度和高度像素單位為px return "DisplayMetrics:" + dm.widthPixels+"* "+dm.heightPixels; } // 獲取手機CPU信息 public static String getCpuInfo() { String str1 = "/proc/cpuinfo"; String str2 = ""; String[] cpuInfo = { "", "" }; // 1-cpu型號 //2-cpu頻率 String[] arrayOfString; try { FileReader fr = new FileReader(str1); BufferedReader localBufferedReader = new BufferedReader(fr, 8192); str2 = localBufferedReader.readLine(); arrayOfString = str2.split("\\s+"); for (int i = 2; i < arrayOfString.length; i++) { cpuInfo[0] = cpuInfo[0] + arrayOfString[i] + " "; } str2 = localBufferedReader.readLine(); arrayOfString = str2.split("\\s+"); cpuInfo[1] += arrayOfString[2]; localBufferedReader.close(); } catch (Exception e) { } return "1-cpu型號:" + cpuInfo[0] + "2-cpu頻率:" + cpuInfo[1]; } /** * 去掉 +86|86 短信中心號和手機號碼 * * @param str * @return */ public static String getSub(String str) { String subStr = ""; try { if (str == null) { return ""; } int len = str.length(); if (len > 11) { subStr = str.substring(len - 11); } else { subStr = str; } } catch (Exception ioe) { } return subStr; } /** * IMEI:international mobile Equipment identity手機唯一標識碼 * @return */ public String getImei(){ return tm.getDeviceId(); } /** * 獲取手機號 取出MSISDN,很可能為空 * @return */ public String getPhone(){ return tm.getLine1Number(); } /** * ICCID:ICC identity集成電路卡標識,這個是唯一標識一張卡片物理號碼的 * @return */ public String getIccid(){ if (isSimReady(mContext)) { return tm.getSimSerialNumber(); } return ""; } /** * IMSI 全稱為 International Mobile Subscriber Identity,中文翻譯為國際移動用戶識別碼。 * 它是在公眾陸地移動電話網(PLMN)中用於唯一識別移動用戶的一個號碼。在GSM網絡,這個號碼通常被存放在SIM卡中 * @return */ public String getSubscriberId(){ if (isSimReady(mContext)) { return tm.getSubscriberId(); } return ""; } public String getMNC(){ String imsi = getSubscriberId(); if (imsi!=null && !imsi.equals("")) { return imsi.substring(0,4); } return ""; } /** * 判斷SIM卡是否准備好 * * @param context * @return */ public boolean isSimReady(Context context) { try { int simState = tm.getSimState(); if (simState == TelephonyManager.SIM_STATE_READY) { return true; } } catch (Exception e) { Log.w("PhoneHelper", "021:" + e.toString()); } return false; } /** * 獲取當前網絡狀況 * * @return 如果網絡已經連接,並且可用返回true, 否則false * */ public static boolean getNetworkState(Context context) { try { ConnectivityManager connectivity = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); if (connectivity != null) { NetworkInfo networkinfo = connectivity.getActiveNetworkInfo(); if (networkinfo != null) { if (networkinfo.isAvailable() && networkinfo.isConnected()) { return true; } } } } catch (Exception e) { return false; } return false; } /** * 判斷是否模擬器。如果返回TRUE, 則當前是模擬器,模擬器IMEI是:00000000000000 運營商不讓支付 * * @param context * @return * */ public boolean isEmulator(Context context) { try { String imei = tm.getDeviceId(); if (imei != null && imei.equals("000000000000000")) { return true; } return (Build.MODEL.equals("sdk")) || (Build.MODEL.equals("google_sdk")); } catch (Exception ioe) { Log.w("PhoneHelper", "009:" + ioe.toString()); } return false; } /** * 獲取當前APP名稱和版本號 * @param context * @return * @throws Exception */ public static String getAppInfo(Context context) { context=context.getApplicationContext(); String applicationName =""; String versionName=""; String packageName =""; int versionCode; try { PackageManager packageManager = context.getPackageManager(); PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0); ApplicationInfo applicationInfo =packageManager.getApplicationInfo(context.getPackageName(), 0); applicationName = (String) packageManager.getApplicationLabel(applicationInfo); versionName= packageInfo.versionName; packageName= packageInfo.packageName; versionCode = packageInfo.versionCode; return "applicationName:"+applicationName+ " packageName:"+packageName+" versionName:"+versionName+" versionCode:"+versionCode; } catch (NameNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } /** * 獲取當前APP名稱和版本號 * * @param context * @return applicationName packageName versionName versionCode */ public static Map<String, String> getAppInfoMap(Context context) { String applicationName = ""; String versionName = ""; String packageName = ""; int versionCode; try { PackageManager packageManager = context.getPackageManager(); PackageInfo packageInfo = packageManager.getPackageInfo( context.getPackageName(), 0); ApplicationInfo applicationInfo = packageManager .getApplicationInfo(context.getPackageName(), 0); applicationName = (String) packageManager .getApplicationLabel(applicationInfo); versionName = packageInfo.versionName; packageName = packageInfo.packageName; versionCode = packageInfo.versionCode; Map<String, String> map = new HashMap<String, String>(); map.put("appName", applicationName); map.put("packageName", packageName); map.put("versionName", versionName); map.put("versionCode", versionCode + ""); return map; } catch (NameNotFoundException e) { e.printStackTrace(); } return null; } /** * 獲取MetaDataValue * @param name * @param def * @return */ public String getMetaDataValue(String name, String def) { String value = getMetaDataValue(name); return (value == null) ? def : value; } private String getMetaDataValue(String name) { Object value = null; PackageManager packageManager = mContext.getPackageManager(); ApplicationInfo applicationInfo; try { applicationInfo = packageManager.getApplicationInfo(mContext.getPackageName(),PackageManager.GET_META_DATA); if (applicationInfo != null && applicationInfo.metaData != null) { value = applicationInfo.metaData.get(name); } } catch (Exception e) { } return value.toString(); } }