android手机获取手机号

最近做到一个项目,需要获取手机号。项目中使用的手机卡为电信卡,那么就以此为例吧。

网上不符合需求的方法

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. import android.content.BroadcastReceiver;
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.telephony.SmsMessage;
  6. public class SMS_Receiver extends BroadcastReceiver {
  7. final String GetNumberAddress="10001";
  8. @Override
  9. public void onReceive(Context context, Intent intent) {
  10. // TODO Auto-generated method stub
  11. if(intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")){
  12. Object[] pdus=(Object[])intent.getExtras().get("pdus");
  13. //不知道为什么明明只有一条消息,传过来的却是数组,也许是为了处理同时同分同秒同毫秒收到多条短信
  14. //但这个概率有点小
  15. SmsMessage[] message=new SmsMessage[pdus.length];
  16. StringBuilder sb=new StringBuilder();
  17. System.out.println("pdus长度"+pdus.length);
  18. String address="";
  19. for(int i=0;i<pdus.length;i++){
  20. //虽然是循环,其实pdus长度一般都是1
  21. message[i]=SmsMessage.createFromPdu((byte[])pdus[i]);
  22. sb.append("接收到短信来自:\n");
  23. address=message[i].getDisplayOriginatingAddress();
  24. sb.append(address+"\n");
  25. sb.append("内容:"+message[i].getDisplayMessageBody());
  26. }
  27. System.out.println(sb.toString());
  28. if(SMSCore.PhoneNumber==""&&address.equals(GetNumberAddress)){
  29. SMSCore.PhoneNumber=SMSCore.GetPhoneNumberFromSMSText(sb.toString());
  30. MessageTools.ShowDialog(context, address);
  31. }
  32. MessageTools.ShowDialog(context, sb.toString().trim());
  33. MessageTools.ShowDialog(context, SMSCore.PhoneNumber);
  34. }
  35. }
  36. }

2.短信操作类

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

3.弹出框操作类

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

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);

时间: 2024-11-13 11:50:11

android手机获取手机号的相关文章

Android手机获取手机唯一识别号(转)

写在前面,发这个帖我想,可能很多人用不到,那你就当科普了解了,其实每个游戏,软件都会获取你的imei废话不说,开始! 在开发手机应用时,开发者最关心的是开发的手机软件有多少用户安装,并且正在使用.这就需要识别手机的唯一性.目前我了解的有两种方法,获取手机的 imei号(imei号是唯一识别手机的号码).获取android id号(android id 是手机系统的唯一号码). 第一种方法: android获取手机imei号的方法在在android系统中获取imei号和其他手机信息一文中做了详细的

Android手机获取通讯录联系人信息及短信广播实现

现在越来越多的android应用在注册时都要用到手机号码,通过获取手机验证码来完成注册.也有不少应用提供了手机通讯录备份功能,获得你的允许后把你的通讯录中的手机号码保存到服务器中,你要的时候又可以down下来,比如微信,QQ等就有这们的功能.那我们怎么样获取用户通讯录中的手机号码呢?Android已经为我们做好了准备: ---------------------------------获取通讯录联系人信息----------------------------------------------

Android - 手机开发调试无法输出logcat信息 - 未解决

参考链接:Android手机在开发调试时logcat不显示输出信息的解决办法 Android:真机调试,不显示logcat的解决规划 Coolpad 8730L 进入手机工厂模式: Dial:   *#9527*# android 手机获取root 打开USB调试选项,使用一键root工具,e.g:客户端 KingRoot 设置logcat level: 出现如下结果1,断开其他android设备或者模拟器,保持一个手机与电脑连接:2,手机rom需要获取root权限 adb shell su P

Android编程获取手机的IMEI

手机在生产时,每部手机均有一个唯一的标识(ID),国际上采用国际移动设备身份码(IMEI, International Mobile Equipment Identity).IMEI是由15位数字组成的"电子串号",它与每台手机一一对应,而且该码是全世界唯一的.每一只手机在组装完成后都将被赋予一个全球唯一的一组号码,这个号码从生产到交付使用都将被制造生产的厂商所记录. 在手机应用开发中,使用IMEI来做身份认证是一个常用的技术手段,在Android SDK中,类android.tele

Android Demo手机获取验证码

注册很多app或者网络账户的时候,经常需要手机获取验证码,来完成注册,那时年少,只是觉得手机获取验证码这件事儿很好玩,并没有关心太多,她是如何实现的,以及她背后的故事到底是什么样子的,现在小编接手的这个项目里面,就需要通过手机号进行注册,并且手机号发送相应的验证码,来完成注册,那么在一些应用app里面到底是如何实现点击按钮获取验证码,来完成注册这整个流程的呢?今天小编就以注册为例,和小伙伴们分享一下,如何通过手机号获取验证码来完成注册的一整套流程以及如何采用正则表达式来验证手机号码是否符合电信.

Android编程获取手机型号,本机电话号码,sdk版本及firmware版本号(即系统版本号)

Android开发平台中,可通过TelephonyManager 获取本机号码. TelephonyManager phoneMgr=(TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE); txtPhoneNumber.setText(phoneMgr.getLine1Number()); //txtPhoneNumber是一个EditText 用于显示手机号 注: 根据Android的安全机制,在使用Telepho

android获取手机号

private String getPhoneNum(){ //与手机建立连接 TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); String phoneId = tm.getLine1Number(); //获取手机号码 Log.i(phoneId,phoneId); return phoneId; } android获取手机号

Android手机如何获取power_profile.xml文件

最近在做关于能耗方面的测试,看了一个月时间的论文,终于找到了一些新的思路,但是一个问题出现了,以至于 工作无法再进行下去. 在Android手机中,对于手机中的每个部件(cpu.led.gps.3g等等)运行时对应的能耗值都放power_profile.xml 文件中,而且系统的 设置-->电池-->使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数 的.Android手机如何获取power_profile.xml文件呢?接下来我们会详细介绍该问题

Android手机自带内部存储路径的获取 (转)

转自:http://my.oschina.net/liucundong/blog/288183 我有一台中兴的Android手机,型号是 ZTE U930HD,手机没有插入外置SD卡(也就是Micro SD Card,原名Trans-flash Card(TF卡),2004年正式更名为Micro SD Card),但是机身自带了一个内置存储卡(也就是eMMC存储,大小为2G). 我把这个手机用数据线插到电脑上,也会看到盘符,通过安装「R.E 管理器」等文件管理应用,也可以管理文件,并且能看到该存