您的位置:首页 > 移动开发 > Android开发

android手机获取手机号

2014-03-02 09:24 363 查看
最近做到一个项目,需要获取手机号。项目中使用的手机卡为电信卡,那么就以此为例吧。

网上不符合需求的方法

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

[java] view
plaincopyprint?





//获取手机号码  

TelephonyManager tm = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);  

  String deviceid = tm.getDeviceId();//获取智能设备唯一编号  

  String te1  = tm.getLine1Number();//获取本机号码  

  String imei = tm.getSimSerialNumber();//获得SIM卡的序号  

  String imsi = tm.getSubscriberId();//得到用户Id  

添加权限:

[html] view
plaincopyprint?





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

以上做法有可能获取sim卡号,但是现在最起码在电信手机卡上获取不到。

原因好像、似乎是:

手机号码不是所有的都能获取。只是有一部分可以拿到。这个是由于移动运营商没有把手机号码的数据写入到sim卡中.SIM卡只有唯一的编号,供网络与设备识别那就是IMSI号码,手机的信号也可以说是通过这个号码在网络中传递的,并不是手机号码。试想,你的SIM卡丢失后,补办一张新的会换号码吗?是不会的.就是因为在你的手机号码对应的IMSI号
在移动运营商中被修改成新SIM卡的IMSI号码。 

那么我们怎么解决这个问题呢?

不好实现?一个原因搞定你:项目需要!!

查了下手机的基本信息那一栏里,也没有找到手机号,看来手机中似乎没有存储这手机号。那么我就只有使用变通的手法来获取手机号了。

就是给10001发送一个短信,找了一下,发个501查询套餐情况就可以。10001会给你个反馈信息,其中包含手机号码



那么我们发送短信,然后监听得到此短信,然后分解字符串那么就可以得到手机号了。

如果是联通或者移动应该也是有类似的情况。何况给他们发短信应该不会收费。。。O(∩_∩)O~

程序如何实现?

1.监听短信类

[java] view
plaincopyprint?





package com.example.smsmanager;  

  

import android.content.BroadcastReceiver;  

import android.content.Context;  

import android.content.Intent;  

import android.telephony.SmsMessage;  

  

public class SMS_Receiver extends BroadcastReceiver {  

  

    final String GetNumberAddress="10001";  

    @Override  

    public void onReceive(Context context, Intent intent) {  

        // TODO Auto-generated method stub  

        if(intent.getAction().equals("an
23460
droid.provider.Telephony.SMS_RECEIVED")){  

              

            Object[] pdus=(Object[])intent.getExtras().get("pdus");  

            //不知道为什么明明只有一条消息,传过来的却是数组,也许是为了处理同时同分同秒同毫秒收到多条短信  

            //但这个概率有点小  

            SmsMessage[] message=new SmsMessage[pdus.length];  

            StringBuilder sb=new StringBuilder();  

            System.out.println("pdus长度"+pdus.length);  

            String address="";  

            for(int i=0;i<pdus.length;i++){  

                //虽然是循环,其实pdus长度一般都是1  

                message[i]=SmsMessage.createFromPdu((byte[])pdus[i]);  

                sb.append("接收到短信来自:\n");  

                address=message[i].getDisplayOriginatingAddress();  

                sb.append(address+"\n");  

                sb.append("内容:"+message[i].getDisplayMessageBody());  

            }  

            System.out.println(sb.toString());  

            if(SMSCore.PhoneNumber==""&&address.equals(GetNumberAddress)){  

                SMSCore.PhoneNumber=SMSCore.GetPhoneNumberFromSMSText(sb.toString());  

                MessageTools.ShowDialog(context, address);  

            }  

            MessageTools.ShowDialog(context, sb.toString().trim());  

            MessageTools.ShowDialog(context, SMSCore.PhoneNumber);  

        }  

    }  

  

}  

2.短信操作类

[java] view
plaincopyprint?





package com.example.smsmanager;  

  

import java.sql.Date;  

import java.util.ArrayList;  

import java.util.List;  

import java.util.regex.Matcher;  

import java.util.regex.Pattern;  

  

import android.view.View;  

import android.view.View.OnClickListener;  

import android.content.BroadcastReceiver;  

import android.app.Activity;  

import android.app.PendingIntent;  

import android.content.Context;  

import android.content.Intent;  

import android.content.IntentFilter;  

import android.telephony.SmsManager;  

import android.util.Log;  

import android.content.ContextWrapper;  

  

public class SMSCore {  

      

        public static String PhoneNumber="";  

        //==============Get Phone Number ==============================  

          

        //get the phone number from sms  

        public static String GetPhoneNumberFromSMSText(String sms){  

              

            List<String> list=GetNumberInString(sms);  

            for(String str:list){  

                if(str.length()==11)  

                    return str;  

            }  

            return "";  

        }  

        public static List<String> GetNumberInString(String str){  

            List<String> list=new ArrayList<String>();  

                String regex = "\\d*";  

                        Pattern p = Pattern.compile(regex);  

  

                        Matcher m = p.matcher(str);  

  

                        while (m.find()) {  

                        if (!"".equals(m.group()))  

                         list.add(m.group());  

                          }  

                      return list;  

        }  

          

        //===========================================================  

        //  

        //  

        //=============Send SMS================  

        public  void SendSMS(String number,String text,Context context){  

               

            PendingIntent pi = PendingIntent.getActivity(context, 0,  

                    new Intent(context, context.getClass()), 0);  

            SmsManager sms = SmsManager.getDefault();  

            sms.sendTextMessage(number, null, text, pi, null);  

  

        }  

          

        public void SendSMS2(String number,String text,Context context){  

            String SENT = "sms_sent";  

            String DELIVERED = "sms_delivered";  

            PendingIntent sentPI = PendingIntent.getActivity(context, 0, new Intent(SENT), 0);  

            PendingIntent deliveredPI = PendingIntent.getActivity(context, 0, new Intent(DELIVERED), 0);  

//            

//          //  

//           registerReceiver(new BroadcastReceiver(){  

//                  @Override  

//                  public void onReceive(Context context, Intent intent){  

//                      switch(getResultCode())  

//                      {  

//                          case Activity.RESULT_OK:  

//                              Log.i("====>", "RESULT_OK");  

//                              System.out.println("RESULT_OK");  

//                                

//                              break;  

//                          case Activity.RESULT_CANCELED:  

//                              Log.i("=====>", "RESULT_CANCELED");  

//                              break;  

//                      }  

//                  }  

//              }, new IntentFilter(DELIVERED));  

//            //  

              

            SmsManager smsm = SmsManager.getDefault();  

            smsm.sendTextMessage(number, null, text, sentPI, deliveredPI);  

        }  

          

        //=====================================  

}  

3.弹出框操作类

[csharp] view
plaincopyprint?





package com.example.smsmanager;  

  

import android.app.AlertDialog;  

import android.app.AlertDialog.Builder;  

import android.content.Context;  

import android.content.DialogInterface;  

import android.content.DialogInterface.OnClickListener;  

  

public class MessageTools {  

    public static void ShowDialog(Context context, String text){  

        AlertDialog.Builder builder = new Builder(context);  

          builder.setMessage(text);  

  

          builder.setTitle("提示");  

  

          builder.setPositiveButton("确认", new OnClickListener() {  

  

           @Override  

           public void onClick(DialogInterface dialog, int which) {  

            dialog.dismiss();  

  

            dialog.dismiss();  

           }  

          });  

  

          builder.setNegativeButton("取消", new OnClickListener() {  

  

           @Override  

           public void onClick(DialogInterface dialog, int which) {  

            dialog.dismiss();  

           }  

          });  

  

          builder.create().show();  

    }  

}  

4.调用如下:

[java] view
plaincopyprint?





//  

    private static final String ACTION_SMS_SEND = "lab.sodino.sms.send";    

    private static final String ACTION_SMS_DELIVERY = "lab.sodino.sms.delivery";    

    private static final String ACTION_SMS_RECEIVER = "android.provider.Telephony.SMS_RECEIVED";  

[java] view
plaincopyprint?





// 注册接收下行receiver    

       SMS_Receiver smsReceiver= new SMS_Receiver();    

       IntentFilter receiverFilter = new IntentFilter(ACTION_SMS_RECEIVER);    

       registerReceiver(smsReceiver, receiverFilter);    

//发送短信  

SMSCore smscore=new SMSCore();  

smscore.SendSMS2("10001", "501", context);  

运行结果:

我们可以得到了想要的手机号码了!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息