android手機獲取手機號


來源:http://www.cnblogs.com/android100/p/android-get-num.html

最近做到一個項目,需要獲取手機號。項目中使用的手機卡為電信卡,那么就以此為例吧。

網上不符合需求的方法

Google了一下,網上的做法如下: 

  1. //獲取手機號碼  
  2. TelephonyManager tm = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);  
  3.   String deviceid = tm.getDeviceId();//獲取智能設備唯一編號  
  4.   String te1  = tm.getLine1Number();//獲取本機號碼  
  5.   String imei = tm.getSimSerialNumber();//獲得SIM卡的序號  
  6.   String imsi = tm.getSubscriberId();//得到用戶Id  

添加權限: 

  1. <uses-permissionandroid:nameuses-permissionandroid:name="android.permission.READ_PHONE_STATE"/  

以上做法有可能獲取sim卡號,但是現在最起碼在電信手機卡上獲取不到。

原因好像、似乎是:

手機號碼不是所有的都能獲取。只是有一部分可以拿到。這個是由於移動運營商沒有把手機號碼的數據寫入到sim卡中.SIM卡只有唯一的編號,供網絡與設備識別那就是IMSI號碼,手機的信號也可以說是通過這個號碼在網絡中傳遞的,並不是手機號碼。試想,你的SIM卡丟失后,補辦一張新的會換號碼嗎?是不會的.就是因為在你的手機號碼對應的IMSI號 在移動運營商中被修改成新SIM卡的IMSI號碼。 

那么我們怎么解決這個問題呢?

不好實現?一個原因搞定你:項目需要!!

查了下手機的基本信息那一欄里,也沒有找到手機號,看來手機中似乎沒有存儲這手機號。那么我就只有使用變通的手法來獲取手機號了。

就是給10001發送一個短信,找了一下,發個501查詢套餐情況就可以。10001會給你個反饋信息,其中包含手機號碼

那么我們發送短信,然后監聽得到此短信,然后分解字符串那么就可以得到手機號了。

如果是聯通或者移動應該也是有類似的情況。何況給他們發短信應該不會收費。。。O(∩_∩)O~

程序如何實現?

 

1.監聽短信類 

  1. package com.example.smsmanager;  
  2.   
  3. import android.content.BroadcastReceiver;  
  4. import android.content.Context;  
  5. import android.content.Intent;  
  6. import android.telephony.SmsMessage;  
  7.   
  8. public class SMS_Receiver extends BroadcastReceiver {  
  9.   
  10.     final String GetNumberAddress="10001";  
  11.     @Override  
  12.     public void onReceive(Context context, Intent intent) {  
  13.         // TODO Auto-generated method stub  
  14.         if(intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")){  
  15.               
  16.             Object[] pdus=(Object[])intent.getExtras().get("pdus");  
  17.             //不知道為什么明明只有一條消息,傳過來的卻是數組,也許是為了處理同時同分同秒同毫秒收到多條短信  
  18.             //但這個概率有點小  
  19.             SmsMessage[] message=new SmsMessage[pdus.length];  
  20.             StringBuilder sb=new StringBuilder();  
  21.             System.out.println("pdus長度"+pdus.length);  
  22.             String address="";  
  23.             for(int i=0;i<pdus.length;i++){  
  24.                 //雖然是循環,其實pdus長度一般都是1  
  25.                 message[i]=SmsMessage.createFromPdu((byte[])pdus[i]);  
  26.                 sb.append("接收到短信來自:\n");  
  27.                 address=message[i].getDisplayOriginatingAddress();  
  28.                 sb.append(address+"\n");  
  29.                 sb.append("內容:"+message[i].getDisplayMessageBody());  
  30.             }  
  31.             System.out.println(sb.toString());  
  32.             if(SMSCore.PhoneNumber==""&&address.equals(GetNumberAddress)){  
  33.                 SMSCore.PhoneNumber=SMSCore.GetPhoneNumberFromSMSText(sb.toString());  
  34.                 MessageTools.ShowDialog(context, address);  
  35.             }  
  36.             MessageTools.ShowDialog(context, sb.toString().trim());  
  37.             MessageTools.ShowDialog(context, SMSCore.PhoneNumber);  
  38.         }  
  39.     }  
  40.   
  41. }  



2.短信操作類 

  1. package com.example.smsmanager;  
  2.   
  3. import java.sql.Date;  
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6. import java.util.regex.Matcher;  
  7. import java.util.regex.Pattern;  
  8.   
  9. import android.view.View;  
  10. import android.view.View.OnClickListener;  
  11. import android.content.BroadcastReceiver;  
  12. import android.app.Activity;  
  13. import android.app.PendingIntent;  
  14. import android.content.Context;  
  15. import android.content.Intent;  
  16. import android.content.IntentFilter;  
  17. import android.telephony.SmsManager;  
  18. import android.util.Log;  
  19. import android.content.ContextWrapper;  
  20.   
  21. public class SMSCore {  
  22.       
  23.         public static String PhoneNumber="";  
  24.         //==============Get Phone Number ==============================  
  25.           
  26.         //get the phone number from sms  
  27.         public static String GetPhoneNumberFromSMSText(String sms){  
  28.               
  29.             List<String> list=GetNumberInString(sms);  
  30.             for(String str:list){  
  31.                 if(str.length()==11)  
  32.                     return str;  
  33.             }  
  34.             return "";  
  35.         }  
  36.         public static List<String> GetNumberInString(String str){  
  37.             List<String> list=new ArrayList<String>();  
  38.                 String regex = "\\d*";  
  39.                         Pattern p = Pattern.compile(regex);  
  40.   
  41.                         Matcher m = p.matcher(str);  
  42.   
  43.                         while (m.find()) {  
  44.                         if (!"".equals(m.group()))  
  45.                          list.add(m.group());  
  46.                           }  
  47.                       return list;  
  48.         }  
  49.           
  50.         //===========================================================  
  51.         //  
  52.         //  
  53.         //=============Send SMS================  
  54.         public  void SendSMS(String number,String text,Context context){  
  55.                
  56.             PendingIntent pi = PendingIntent.getActivity(context, 0,  
  57.                     new Intent(context, context.getClass()), 0);  
  58.             SmsManager sms = SmsManager.getDefault();  
  59.             sms.sendTextMessage(number, null, text, pi, null);  
  60.   
  61.         }  
  62.           
  63.         public void SendSMS2(String number,String text,Context context){  
  64.             String SENT = "sms_sent";  
  65.             String DELIVERED = "sms_delivered";  
  66.             PendingIntent sentPI = PendingIntent.getActivity(context, 0, new Intent(SENT), 0);  
  67.             PendingIntent deliveredPI = PendingIntent.getActivity(context, 0, new Intent(DELIVERED), 0);  
  68. //            
  69. //          //  
  70. //           registerReceiver(new BroadcastReceiver(){  
  71. //                  @Override  
  72. //                  public void onReceive(Context context, Intent intent){  
  73. //                      switch(getResultCode())  
  74. //                      {  
  75. //                          case Activity.RESULT_OK:  
  76. //                              Log.i("====>", "RESULT_OK");  
  77. //                              System.out.println("RESULT_OK");  
  78. //                                
  79. //                              break;  
  80. //                          case Activity.RESULT_CANCELED:  
  81. //                              Log.i("=====>", "RESULT_CANCELED");  
  82. //                              break;  
  83. //                      }  
  84. //                  }  
  85. //              }, new IntentFilter(DELIVERED));  
  86. //            //  
  87.               
  88.             SmsManager smsm = SmsManager.getDefault();  
  89.             smsm.sendTextMessage(number, null, text, sentPI, deliveredPI);  
  90.         }  
  91.           
  92.         //=====================================  
  93. }  

 

3.彈出框操作類 

  1. package com.example.smsmanager;  
  2.   
  3. import android.app.AlertDialog;  
  4. import android.app.AlertDialog.Builder;  
  5. import android.content.Context;  
  6. import android.content.DialogInterface;  
  7. import android.content.DialogInterface.OnClickListener;  
  8.   
  9. public class MessageTools {  
  10.     public static void ShowDialog(Context context, String text){  
  11.         AlertDialog.Builder builder = new Builder(context);  
  12.           builder.setMessage(text);  
  13.   
  14.           builder.setTitle("提示");  
  15.   
  16.           builder.setPositiveButton("確認", new OnClickListener() {  
  17.   
  18.            @Override  
  19.            public void onClick(DialogInterface dialog, int which) {  
  20.             dialog.dismiss();  
  21.   
  22.             dialog.dismiss();  
  23.            }  
  24.           });  
  25.   
  26.           builder.setNegativeButton("取消", new OnClickListener() {  
  27.   
  28.            @Override  
  29.            public void onClick(DialogInterface dialog, int which) {  
  30.             dialog.dismiss();  
  31.            }  
  32.           });  
  33.   
  34.           builder.create().show();  
  35.     }  
  36. }  



 

4.調用如下: 

  1. //  
  2.     private static final String ACTION_SMS_SEND = "lab.sodino.sms.send";    
  3.     private static final String ACTION_SMS_DELIVERY = "lab.sodino.sms.delivery";    
  4.     private static final String ACTION_SMS_RECEIVER = "android.provider.Telephony.SMS_RECEIVED";  

 

  1. // 注冊接收下行receiver    
  2.        SMS_Receiver smsReceiver= new SMS_Receiver();    
  3.        IntentFilter receiverFilter = new IntentFilter(ACTION_SMS_RECEIVER);    
  4.        registerReceiver(smsReceiver, receiverFilter);    
  5. //發送短信  
  6. SMSCore smscore=new SMSCore();  
  7. smscore.SendSMS2("10001", "501", context);  

 

運行結果:

我們可以得到了想要的手機號碼了!

 

 

 

 

 

 

 

 

 

------------------------------------------------------------------------------------------------------------------------------------------------

 

 

 

 

 

 

 

 

android 安卓APP獲取手機設備信息和手機號碼的代碼示例

 

下面我從安卓開發的角度,簡單寫一下如何獲取手機設備信息和手機號碼

 

准備條件:一部安卓手機、手機SIM卡確保插入手機里、eclipse ADT和Android-sdk開發環境

 

第一步:新建一個android工程(JinshanTest),

 

並需要在工程的AndroidManifest.xml文件中,添加權限

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

 

圖例:

 

 

第二步:新建一個工具類PhoneInfo.Java

 

[java]  view plain  copy
 
 print?
  1. package com.jinshan.test;  
  2.   
  3.   
  4. import android.content.Context;  
  5. import android.telephony.TelephonyManager;  
  6.   
  7. /** 
  8.  * 讀取手機設備信息測試代碼 
  9.  * http://www.souapp.com 搜應用網  
  10.  * song2c@163.com 
  11.  * 宋立波 
  12.  */  
  13. public class PhoneInfo {  
  14.   
  15.     private TelephonyManager telephonyManager;  
  16.     /** 
  17.      * 國際移動用戶識別碼 
  18.      */  
  19.     private String IMSI;  
  20.     private Context cxt;  
  21.     public PhoneInfo(Context context) {  
  22.         cxt=context;  
  23.         telephonyManager = (TelephonyManager) context  
  24.                 .getSystemService(Context.TELEPHONY_SERVICE);  
  25.     }  
  26.   
  27.     /** 
  28.      * 獲取電話號碼 
  29.      */  
  30.     public String getNativePhoneNumber() {  
  31.         String NativePhoneNumber=null;  
  32.         NativePhoneNumber=telephonyManager.getLine1Number();  
  33.         return NativePhoneNumber;  
  34.     }  
  35.   
  36.     /** 
  37.      * 獲取手機服務商信息 
  38.      */  
  39.     public String getProvidersName() {  
  40.         String ProvidersName = "N/A";  
  41.         try{  
  42.         IMSI = telephonyManager.getSubscriberId();  
  43.         // IMSI號前面3位460是國家,緊接着后面2位00 02是中國移動,01是中國聯通,03是中國電信。  
  44.         System.out.println(IMSI);  
  45.         if (IMSI.startsWith("46000") || IMSI.startsWith("46002")) {  
  46.             ProvidersName = "中國移動";  
  47.         } else if (IMSI.startsWith("46001")) {  
  48.             ProvidersName = "中國聯通";  
  49.         } else if (IMSI.startsWith("46003")) {  
  50.             ProvidersName = "中國電信";  
  51.         }  
  52.         }catch(Exception e){  
  53.             e.printStackTrace();  
  54.         }  
  55.         return ProvidersName;  
  56.     }  
  57.       
  58.     public String  getPhoneInfo(){  
  59.          TelephonyManager tm = (TelephonyManager)cxt.getSystemService(Context.TELEPHONY_SERVICE);  
  60.             StringBuilder sb = new StringBuilder();  
  61.   
  62.             sb.append("\nDeviceId(IMEI) = " + tm.getDeviceId());  
  63.             sb.append("\nDeviceSoftwareVersion = " + tm.getDeviceSoftwareVersion());  
  64.             sb.append("\nLine1Number = " + tm.getLine1Number());  
  65.             sb.append("\nNetworkCountryIso = " + tm.getNetworkCountryIso());  
  66.             sb.append("\nNetworkOperator = " + tm.getNetworkOperator());  
  67.             sb.append("\nNetworkOperatorName = " + tm.getNetworkOperatorName());  
  68.             sb.append("\nNetworkType = " + tm.getNetworkType());  
  69.             sb.append("\nPhoneType = " + tm.getPhoneType());  
  70.             sb.append("\nSimCountryIso = " + tm.getSimCountryIso());  
  71.             sb.append("\nSimOperator = " + tm.getSimOperator());  
  72.             sb.append("\nSimOperatorName = " + tm.getSimOperatorName());  
  73.             sb.append("\nSimSerialNumber = " + tm.getSimSerialNumber());  
  74.             sb.append("\nSimState = " + tm.getSimState());  
  75.             sb.append("\nSubscriberId(IMSI) = " + tm.getSubscriberId());  
  76.             sb.append("\nVoiceMailNumber = " + tm.getVoiceMailNumber());  
  77.            return  sb.toString();  
  78.     }  
  79. }  



 

第三步:在啟動的Activity,JinshanTestActivity中添加,調用代碼:

 

[java]  view plain  copy
 
 print?
  1. package com.jinshan.test;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5.   
  6. public class JinshanTestActivity extends Activity {  
  7.     /** Called when the activity is first created. */  
  8.     @Override  
  9.     public void onCreate(Bundle savedInstanceState) {  
  10.         super.onCreate(savedInstanceState);  
  11.         setContentView(R.layout.main);  
  12.           
  13.         PhoneInfo siminfo = new PhoneInfo(JinshanTestActivity.this);  
  14.         System.out.println("getProvidersName:"+siminfo.getProvidersName());  
  15.         System.out.println("getNativePhoneNumber:"+siminfo.getNativePhoneNumber());  
  16.         System.out.println("------------------------");  
  17.         System.out.println("getPhoneInfo:"+siminfo.getPhoneInfo());  
  18.     }  
  19.       
  20.       
  21.       
  22. }  


第四步,把手機使用USB線,連接到電腦上,確保是連通性,開始運行工程

 

 

 

最后,我們看LOGCAT日志,結果如下:

------------------------------------------------------------

04-01 16:20:57.105: I/System.out(952): 460003121934674
04-01 16:20:57.105: I/System.out(952): getProvidersName:中國移動
04-01 16:20:57.115: I/System.out(952): getNativePhoneNumber:136XXXXXXX
04-01 16:20:57.115: I/System.out(952): ------------------------
04-01 16:20:57.145: I/System.out(952): getPhoneInfo:
04-01 16:20:57.145: I/System.out(952): DeviceId(IMEI) = 352XXXXXXXX61328
04-01 16:20:57.145: I/System.out(952): DeviceSoftwareVersion = 01
04-01 16:20:57.145: I/System.out(952): Line1Number = 136XXXXXXX
04-01 16:20:57.145: I/System.out(952): NetworkCountryIso = cn
04-01 16:20:57.145: I/System.out(952): NetworkOperator = 46000
04-01 16:20:57.145: I/System.out(952): NetworkOperatorName = 中國移動
04-01 16:20:57.145: I/System.out(952): NetworkType = 2
04-01 16:20:57.145: I/System.out(952): PhoneType = 1
04-01 16:20:57.145: I/System.out(952): SimCountryIso = cn
04-01 16:20:57.145: I/System.out(952): SimOperator = 46000
04-01 16:20:57.145: I/System.out(952): SimOperatorName = CMCC
04-01 16:20:57.145: I/System.out(952): SimSerialNumber = 898xxxxxx90108
04-01 16:20:57.145: I/System.out(952): SimState = 5
04-01 16:20:57.145: I/System.out(952): SubscriberId(IMSI) = 46000xxxxxxxx4674

那么我們來解釋一下上面的信息具體代表啥意思。

 

getNativePhoneNumber 獲取的手機號

DeviceId(IMEI)手機  國際移動用戶識別碼

NetworkOperator  移動運營商編號

NetworkOperatorName  移動運營商名稱

SimSerialNumber  SimOperator  SimCountryIso  SimSerialNumber  SubscriberId(IMSI)   關於手機SIM卡的一些詳細信息

 

其實代碼中沒有寫 獲取System.ANDROID_ID這個操作,因為很多手機設備獲取不到andnroid_id

 

當然了,我們今天主要講述<uses-permission android:name="android.permission.READ_PHONE_STATE"/> 光使用這個權限我們可以獲得的手機設備信息和手機號

如果想獲得WIFI,藍牙,GPS,讀寫SDCARD更多的信息,就需要添加其它的權限。


此外,本次測試我拿自己的手機SIM卡測試是可以獲取到手機號碼的,當然了有些手機號碼是獲取不到的,這里也給大家羅列了原因,


手機號碼不是所有的都能獲取。只是有一部分可以拿到。

這個是由於移動運營商沒有把手機號碼的數據寫入到sim卡中.SIM卡只有唯一的編號,供網絡與設備識別那就是IMSI號碼,手機的信號也可以說是通過這個號碼在網絡中傳遞的,並不是手機號碼。試想,你的SIM丟失后,補辦一張新的會換號碼嗎?是不會的.就是因為在你的手機號碼對應的IMSI號 在移動運營商中被修改成新SIM卡的IMSI號碼。
  那么手機號為什么有的就能顯示呢?
  這個就像是一個變量,當移動運營商為它賦值了,它自然就會有值。不賦值自然為空。
  對於移動的用戶,手機號碼(MDN)保存在運營商的服務器中,而不是保存在SIM卡里。SIM卡只保留了IMSI和一些驗證信息。手機每次入網注冊的時候,都會以短信的形式將IMSI及驗證信息上傳到運營商的服務器,服務器在完成注冊動作之后,會以短信的形式將注冊的結果下發到手機里。下發的內容會因條件不同而不同。
  如果服務器在下發的短信中,不包含手機的號碼,手機是無法取得電話號碼。如果短信中包含了號碼,手機才會將其緩存,以備他用.此外,對於其他運行商的SIM卡或者UIM卡,MDN有可能保存在UIM卡中。100%能夠取得本機號碼不太可能。
  移動神州行,聯通的卡是可以取到的.動感地帶的取不到.別的卡還沒有試過.
  能夠讀取SIM卡號的話應該有前提.那就是SIM卡已經寫入了本機號碼,不然是無法讀取的。

http://bbs.gfan.com/android-323295-1-1.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM