Android 手机获取手机号实现方法

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

网上不符合需求的方法

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

//获取手机号码
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 

添加权限:

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

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

原因好像、似乎是:

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

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

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

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

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

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

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

程序如何实现?

1.监听短信类

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("android.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.短信操作类

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.弹出框操作类

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.调用如下:

//
 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";
// 注册接收下行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);

运行结果:

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

以上就是Android 获取手机号的实现代码,希望能帮助有需要的朋友,谢谢大家对本站的支持!

(0)

相关推荐

  • Android基于APN获取手机号的方法

    本文实例讲述了Android基于APN获取手机号的方法.分享给大家供大家参考.具体如下: 之前很多人说无法完全获取手机号,是因为现在有的卡不能获取,有的卡能获取,现在我们可以换一种思路来考虑问题,就是用APN的方式.请看代码: APNNET.java如下: /** * 电信APN列表 * @author wudongdong * */ public class APNNET { public static String CTWAP="ctwap"; public static Stri

  • android 获取本机的IP地址和mac物理地址的实现方法

    获取本机IP地址 public String getLocalIpAddress() { WifiManager wifiManager = (WifiManager) getSystemService(android.content.Context.WIFI_SERVICE); WifiInfo wifiInfo = wifiManager.getConnectionInfo(); int ipAddress = wifiInfo.getIpAddress(); try { return In

  • Android实现通讯录效果——获取手机号码和姓名

    首先给大家展示下运行效果图: 由于通讯录在手机里是以数据库贮存的 所以我们可以通过一个方法 context.getContentResolver().query(Phone.CONTENT_URI, null, null, null, null); 来获得通讯录 ,这个方法返回一个游标的数据类型,通过moveToNext()方法来获取所有的手机号码信息 当然读取手机通讯录需要权限 在adnroidManifest文件中声明即可 由于我也实现了打电话的功能 所以也要声明权限 <uses-permi

  • Android获取手机号码和运营商信息的方法

    本文实例讲述了Android获取手机号码和运营商信息的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: package com.pei.activity;    import android.app.Activity;  import android.os.Bundle;  import android.view.View;  import android.view.View.OnClickListener;  import android.widget.Button;  i

  • Android中获取设备的各种信息总结

    一.屏幕分辨率 Display display = getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(size); int width = size.x; int height = size.y; 或者: DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getM

  • Android onCreate( )方法详细介绍

    onCreate( )方法是android应用程序中最常见的方法之一,那么,我们在使用onCreate()方法的时候应该注意哪些问题呢? 先看看Google Android Developers官网上的解释: onCreate(Bundle) is where you initialize your activity. Most importantly, here you will usually call setContentView(int) with a layout resource d

  • Android NDK开发详细介绍

    Android之NDK开发 一.NDK产生的背景 Android平台从诞生起,就已经支持C.C++开发.众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第三方应用都必须使用Java语言.但这并不等同于"第三方应用只能使用Java".在Android SDK首次发布时,Google就宣称其虚拟机Dalvik支持JNI编程方式,也就是第三方应用完全可以通过JNI调用自己的C动态库,即在Android平台上,"Java+C"的

  • Android 手机获取手机号实现方法

    最近做到一个项目,需要获取手机号.项目中使用的手机卡为电信卡,那么就以此为例吧. 网上不符合需求的方法 Google了一下,网上的做法如下: //获取手机号码 TelephonyManager tm = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE); String deviceid = tm.getDeviceId();//获取智能设备唯一编号 String te1 = tm.getLine1Number()

  • Android手机获取root权限并实现关机重启功能的方法

    本文实例讲述了Android手机获取root权限并实现关机重启功能的方法,是Android程序设计中非常常见的重要功能.现分享给大家,供大家在Android程序开发中参考之用. 具体功能代码如下: /* * 执行命令 * @param command * 1.获取root权限 "chmod 777 "+getPackageCodePath() * 2.关机 reboot -p * 3.重启 reboot */ public static boolean execCmd(String c

  • Android简单获取经纬度的方法

    本文实例讲述了Android简单获取经纬度的方法.分享给大家供大家参考,具体如下: public void getLoc() { // 位置 LocationManager locationManager; LocationListener locationListener; Location location; String contextService = Context.LOCATION_SERVICE; String provider; double lat; double lon; l

  • android手机获取gps和基站的经纬度地址实现代码

    复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" an

  • Android手机获取Mac地址的方法

    最常用的方法,通过WiFiManager获取: /** * 通过WiFiManager获取mac地址 * @param context * @return */ private static String tryGetWifiMac(Context context) { WifiManager wm = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE); WifiInfo wi

  • Android手机获取Mac地址的几种方法

    最常用的方法,通过WiFiManager获取: /** * 通过WiFiManager获取mac地址 * @param context * @return */ private static String tryGetWifiMac(Context context) { WifiManager wm = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE); WifiInfo wi

  • Android手机获取IP地址的两种方法

    1.使用WIFI 首先设置用户权限 复制代码 代码如下: <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>  <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>  <

  • android手机获取唯一标识的方法

    获取手机唯一标识 拼接的方式获取手机唯一标识 第一种方式是获取IMEI,但是有的手机如果不是正品的话,就获取不到所以通过这一种方式还是会出现有的设备是没有唯一标识的 第二种方式获取手机卡的序列号,当然这种也不是唯一的,因为有的手机是双卡双待的所以可能会出现空的情况 第三种方式是万能的也就是UUID,随机生成一个标识,但是必须保存在本地,防止下一次进入的时候再次生成随机码 进行三层判断,来获取手机的唯一标识. //获取手机的唯一标识 public String getPhoneSign(){ St

  • Android手机保持屏幕高亮方法

    一开始接触android应用项目时,在项目快上线时策划要求加个高亮,每次都是直接从网上百度一下,现在做游戏了,却还是这个需求,这里备份一下方便后续的查找,毕竟是自己写好且验证没问题的 :) 首先,在Activity里添加一下代码: 成员变量: private PowerManager.WakeLock wakeLock = null; 重写父类Activity的两个方法并添加一下逻辑: @Override public void onResume() { super.onResume(); ac

随机推荐