Android獲取手機裝置識別碼(IMEI)和手機號碼
最近看了下獲取手機裝置ID和手機資訊以及SIM的資訊例子,主要還是借鑑別人的,現在自己寫一下,算是鞏固加深了,也希望能給大家一個參考
必要的條件還是一部真機,SIM卡或者UIM卡。
首先,在AndroidMainfest.xml裡獲取許可權
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>。
其次,新建一個工具類PhoneInfo.java,主要用來獲取手機裝置資訊(附上原始碼):
package com.wx.deviceid; import android.content.Context; import android.telephony.TelephonyManager;public class PhoneInfo { private TelephonyManager telephonemanager; private String IMSI; private Context ctx; /** * 獲取手機國際識別碼IMEI * */ public PhoneInfo(Context context){ ctx=context; telephonemanager=(TelephonyManager)context .getSystemService(Context.TELEPHONY_SERVICE); }/** * 獲取手機號碼 * */ public String getNativePhoneNumber(){ String nativephonenumber=null; nativephonenumber=telephonemanager.getLine1Number(); return nativephonenumber; } /** * 獲取手機服務商資訊 * * */ public String getProvidersName(){ String providerName=null; try{ IMSI=telephonemanager.getSubscriberId(); //IMSI前面三位460是國家號碼,其次的兩位是運營商代號,00、02是中國移動,01是聯通,03是電信。 System.out.print("IMSI是:"+IMSI); if(IMSI.startsWith("46000")||IMSI.startsWith("46002")){ providerName="中國移動"; }else if(IMSI.startsWith("46001")){ providerName="中國聯通"; }else if(IMSI.startsWith("46003")){ providerName="中國電信"; } }catch(Exception e){ e.printStackTrace(); } return providerName; } /** * 獲取手機資訊 * */ public String getPhoneInfo(){ TelephonyManager tm=(TelephonyManager)ctx.getSystemService(Context.TELEPHONY_SERVICE); StringBuilder sb=new StringBuilder(); sb.append("\nDeviceID(IMEI)"+tm.getDeviceId()); sb.append("\nDeviceSoftwareVersion:"+tm.getDeviceSoftwareVersion()); sb.append("\ngetLine1Number:"+tm.getLine1Number()); sb.append("\nNetworkCountryIso:"+tm.getNetworkCountryIso()); sb.append("\nNetworkOperator:"+tm.getNetworkOperator()); sb.append("\nNetworkOperatorName:"+tm.getNetworkOperatorName()); sb.append("\nNetworkType:"+tm.getNetworkType()); sb.append("\nPhoneType:"+tm.getPhoneType()); sb.append("\nSimCountryIso:"+tm.getSimCountryIso()); sb.append("\nSimOperator:"+tm.getSimOperator()); sb.append("\nSimOperatorName:"+tm.getSimOperatorName()); sb.append("\nSimSerialNumber:"+tm.getSimSerialNumber()); sb.append("\ngetSimState:"+tm.getSimState()); sb.append("\nSubscriberId:"+tm.getSubscriberId()); sb.append("\nVoiceMailNumber:"+tm.getVoiceMailNumber()); return sb.toString(); } }
然後,再在啟動的PhoneActivity中,新增呼叫程式碼:
package com.wx.deviceid; /** * 獲取手機裝置測試資訊 * @author wangxiang * 2013-9-17 * */ import android.os.Bundle; import android.app.Activity; import android.view.Menu; public class PhoneActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_phone); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.phone, menu); PhoneInfo siminfo=new PhoneInfo(PhoneActivity.this); System.out.println("\ngetprovider:"+siminfo.getProvidersName()); System.out.println("\ngeNativePhoneNumber:"+siminfo.getNativePhoneNumber()); System.out.println("--------w---x---------"); System.out.println("\ngetphoneinfo:"+siminfo.getPhoneInfo()); return true; } }
第四,完成以上兩步就可以在真機上運行了,為了檢視輸出資訊的方便,可以在logcat中,單獨檢視System.out的資訊,
方法是點選那個綠色的“+”,如圖:,
然後在彈出框中的Filter name 和 By log tag裡面均填入System.out。
好了,現在可以執行專案了,檢視一下logcat結果:
09-17 17:42:49.924: I/System.out(2854): IMSI是:460023217433621
09-17 17:42:49.925: I/System.out(2854): getprovider:中國移動
09-17 17:42:49.931: I/System.out(2854): geNativePhoneNumber:
09-17 17:42:49.932: I/System.out(2854): --------w---x---------
09-17 17:42:49.970: I/System.out(2854): getphoneinfo:
09-17 17:42:49.970: I/System.out(2854): DeviceID(IMEI)863581011235194
09-17 17:42:49.970: I/System.out(2854): DeviceSoftwareVersion:78
09-17 17:42:49.971: I/System.out(2854): getLine1Number:
09-17 17:42:49.971: I/System.out(2854): NetworkCountryIso:cn
09-17 17:42:49.972: I/System.out(2854): NetworkOperator:46000
09-17 17:42:49.972: I/System.out(2854): NetworkOperatorName:中國移動
09-17 17:42:49.972: I/System.out(2854): NetworkType:2
09-17 17:42:49.972: I/System.out(2854): PhoneType:1
09-17 17:42:49.972: I/System.out(2854): SimCountryIso:cn
09-17 17:42:49.972: I/System.out(2854): SimOperator:46002
09-17 17:42:49.972: I/System.out(2854): SimOperatorName:
09-17 17:42:49.977: I/System.out(2854): SimSerialNumber:89860022091387006821
09-17 17:42:49.978: I/System.out(2854): getSimState:5
09-17 17:42:49.978: I/System.out(2854): SubscriberId:460023217433621
09-17 17:42:49.979: I/System.out(2854): VoiceMailNumber:null
其中geNativePhoneNumber的值為空,因為我的手機卡是動感地帶的卡,所以無法獲取,
這一點可以參考我的上一篇隨筆:Android手機號碼不是所有的都能獲取;
另外我用聯通的號碼測試了一下,是可以獲得號碼的。
最後再補充一下以上資訊的具體含義:
getNativePhoneNumber獲取的手機號
DeviceId(IMEI)手機 國際移動使用者識別碼
NetworkOperator 移動運營商編號
NetworkOperatorName 移動運營商名稱
SimSerialNumber SimOperator SimCountryIso SimSerialNumber SubscriberId(IMSI) 關於手機SIM卡的一些詳細資訊。