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手机获取手机号的更多相关文章
- Android手机修改Hosts的方法
Android手机是和Google帐号紧密联系的,由于中国的操蛋情况,很多时候Google帐号无法登录,导致Android市场无法使用. 在电脑上我们通过修改Hosts方法可以解决Google帐号的登 ...
- android平台获取手机IMSI,IMEI ,序列号,和 手机号的方法
1)获取运营商sim卡imsi号, String IMSI =android.os.SystemProperties.get( android.telephony.TelephonyPropertie ...
- android手机如何获取手机号
两个方案:1 通过android.permission.READ_PHONE_STATE读取 2 通过短信过滤,读取手机号. 按照第1个方案,AndroidManifest.xml需要添加 < ...
- Android编程获取手机的IMEI
手机在生产时,每部手机均有一个唯一的标识(ID),国际上采用国际移动设备身份码(IMEI, International Mobile Equipment Identity).IMEI是由15位数字组成 ...
- Android Demo手机获取验证码
注册很多app或者网络账户的时候,经常需要手机获取验证码,来完成注册,那时年少,只是觉得手机获取验证码这件事儿很好玩,并没有关心太多,她是如何实现的,以及她背后的故事到底是什么样子的,现在小编接手的这 ...
- Android 手机上获取手机当前上网IP地址
[转] 原文 Android 手机上获取手机当前上网IP地址 (手机网关给手机号分配的IP) 每个手机上网通过移动网关的时候,网关都会给该手 ...
- Pyqt adb 获取Android手机屏幕
adb的全称为Android Debug Bridge,就是起到调试桥的作用.adb的工作方式比较特殊,采用监听Socket TCP 5554等端口的方式让IDE和Qemu通讯,默认情况下adb会da ...
- Android 手机上获取物理唯一标识码[转]
所有添加有谷歌账户的设备可以返回一个 ANDROID_ID 所有的CDMA设备对于 ANDROID_ID 和 TelephonyManager.getDeviceId() 返回相同的值(只要在设置时添 ...
- 获取Android 手机屏幕宽度和高度以及获取Android手机序列号
1.获取Android 手机屏幕宽度 1 DisplayMetrics dm = new DisplayMetrics(); 2 this.getWindowManager().getDefaultD ...
随机推荐
- 编写 capture filters
编写 capture filters 如有转载,请在转载前给我提一些建议.谢谢. 百度查不到资料,为无能的百度搜索增加点营养的料. 读 http://www.n-cg.net/CaptureFilte ...
- 转:Raspberry Pi(树莓派)试用小记
近期入手一树莓派卡片机,体验了一下它的强大,写篇报告,推广一下哈! 机器截图: 基础参数: CPU:700 MHz, ARM11 内存:512M(还有一种是256M的) 支持GPU加速(高清视频无压力 ...
- 在QT程序中使用cout和cin
1先输入10个数字,再输出. #include <QtCore/QCoreApplication> #include <QtCore/QList> #include <Q ...
- Qt全局热键(windows篇)(使用RegisterHotKey和句柄进行注册)
转载:http://www.cuteqt.com/blog/?p=2088 Qt对于系统底层,一直没有很好的支持,例如串口并口通信,还有我们经常都会用到的全局热键,等等.既然Qt可能出于某种原因,不对 ...
- VCRedist.exe静默安装方法(转)
INNO setup 制作安装包 的时候,发布VC++运行时 [Run]Filename: {app}vcredist_x86.exe; Parameters: /q; WorkingDir: {t ...
- 通过JS触发TextBox的ontextchanged事件,并获取TextBox所在GridView的那一行
protected void txtInsNum_TextChanged(object sender, EventArgs e) { TextBox t = (TextBox)sender; Grid ...
- HDOJ(HDU) 1587 Flowers(水、、)
Problem Description As you know, Gardon trid hard for his love-letter, and now he's spending too muc ...
- 【转】BT5无法找到软件安装包(提供可用的BT更新源)
像我这种一般想起才玩玩BT5的人,跟不上讯息的变化. 偶尔想尝试某个实验,然后去安装,发现提示无法找到软件安装包. 这个时候,应该注意到,现在已经从BT5到kali了,假如想我这种人,肯定比较少留意软 ...
- android 各种xml的作用
1.arrays.xml 定义数组 <resources> <string-array name="proxy_types"> <item&g ...
- POJ1657 Distance on chessboard
Distance on Chessboard Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 25623 Accepted ...