Android 笔记:获取本机手机号(适用于双卡双待手机)
需要验证手机号的功能,但是国内的手机多是双卡双待的,无法获取到两个号码。在Android的官方文档是没有提供相应的Api的,因为标准的Andoird是没有双卡的,好像也只有国内才会搞双卡双待的神器吧。以下记录一下做这个功能所学习到的东西。直接上代码:
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List; import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.telephony.CellInfo;
import android.telephony.TelephonyManager;
import android.view.Menu;
import android.widget.TextView; public class MainActivity extends Activity
{ private TextView tv; private TextView tv2; // /// static String ISDOUBLE; static String SIMCARD; static String SIMCARD_1; static String SIMCARD_2; static boolean isDouble; // // @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv = (TextView) findViewById(R.id.text); tv2 = (TextView) findViewById(R.id.text2); tv2.setText("不知道哪个卡可用!"); getNumber(); } private void getNumber() { TelephonyManager tm = (TelephonyManager) this.getSystemService(this.TELEPHONY_SERVICE); String phoneNumber1 = tm.getLine1Number(); // String phoneNumber2 = tm.getGroupIdLevel1(); initIsDoubleTelephone(this); if (isDouble) { // tv.setText("这是双卡手机!"); tv.setText("本机号码是:" + " " + phoneNumber1 + " " + "这是双卡手机!"); } else { // tv.setText("这是单卡手机"); tv.setText("本机号码是:" + " " + phoneNumber1 + " " + "这是单卡手机"); } } public void initIsDoubleTelephone(Context context) { isDouble = true; Method method = null; Object result_0 = null; Object result_1 = null; TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); try { // 只要在反射getSimStateGemini 这个函数时报了错就是单卡手机(这是我自己的经验,不一定全正确) method = TelephonyManager.class.getMethod("getSimStateGemini", new Class[] { int.class }); // 获取SIM卡1 result_0 = method.invoke(tm, new Object[] { new Integer(0) }); // 获取SIM卡2 result_1 = method.invoke(tm, new Object[] { new Integer(1) }); } catch (SecurityException e) { isDouble = false; e.printStackTrace(); // System.out.println("1_ISSINGLETELEPHONE:"+e.toString()); } catch (NoSuchMethodException e) { isDouble = false; e.printStackTrace(); // System.out.println("2_ISSINGLETELEPHONE:"+e.toString()); } catch (IllegalArgumentException e) { isDouble = false; e.printStackTrace(); } catch (IllegalAccessException e) { isDouble = false; e.printStackTrace(); } catch (InvocationTargetException e) { isDouble = false; e.printStackTrace(); } catch (Exception e) { isDouble = false; e.printStackTrace(); // System.out.println("3_ISSINGLETELEPHONE:"+e.toString()); } SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); Editor editor = sp.edit(); if (isDouble) { // 保存为双卡手机 editor.putBoolean(ISDOUBLE, true); // 保存双卡是否可用 // 如下判断哪个卡可用.双卡都可以用 if (result_0.toString().equals("5") && result_1.toString().equals("5")) { if (!sp.getString(SIMCARD, "2").equals("0") && !sp.getString(SIMCARD, "2").equals("1")) { editor.putString(SIMCARD, "0"); } editor.putBoolean(SIMCARD_1, true); editor.putBoolean(SIMCARD_2, true); tv2.setText("双卡可用"); } else if (!result_0.toString().equals("5") && result_1.toString().equals("5")) {// 卡二可用 if (!sp.getString(SIMCARD, "2").equals("0") && !sp.getString(SIMCARD, "2").equals("1")) { editor.putString(SIMCARD, "1"); } editor.putBoolean(SIMCARD_1, false); editor.putBoolean(SIMCARD_2, true); tv2.setText("卡二可用"); } else if (result_0.toString().equals("5") && !result_1.toString().equals("5")) {// 卡一可用 if (!sp.getString(SIMCARD, "2").equals("0") && !sp.getString(SIMCARD, "2").equals("1")) { editor.putString(SIMCARD, "0"); } editor.putBoolean(SIMCARD_1, true); editor.putBoolean(SIMCARD_2, false); tv2.setText("卡一可用"); } else {// 两个卡都不可用(飞行模式会出现这种种情况) editor.putBoolean(SIMCARD_1, false); editor.putBoolean(SIMCARD_2, false); tv2.setText("飞行模式"); } } else { // 保存为单卡手机 editor.putString(SIMCARD, "0"); editor.putBoolean(ISDOUBLE, false); } editor.commit(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
当然不要忘记添加权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
Android 笔记:获取本机手机号(适用于双卡双待手机)相关推荐
- Android 获取本机手机号(适用于双卡双待手机)
需要验证手机号的功能,但是国内的手机多是双卡双待的,无法获取到两个号码.在Android的官方文档是没有提供相应的Api的,因为标准的Andoird是没有双卡的,好像也只有国内才会搞双卡双待的神器吧. ...
- Android高手进阶教程(十一)之----Android 通用获取Ip的方法(判断手机是否联网的方法)!
大家好,我们这一节讲一下,Android获取Ip的一些方法,在我们开发中,有判断手机是否联网,或者想获得当前手机的Ip地址,当然WIFI连接的和 我们3G卡的Ip地址当然是不一样的. 首先我尝试了如下 ...
- android 获取手机IMSI码 双卡双待手机
public static String getImsi(Context context) {String imsi = "";try { //普通方法获取imsiTelephon ...
- Android 笔记:识别银行卡,获取银行卡卡号
这个demo是用的card.io 提供的SDK,识别准确率比较高 先看一下效果图: 扫描界面: 识别成功界面 开始界面 在这里说一下集成的两种方式, 1.直接把途中的文件解压开复制到工程目录下的lib ...
- Android开发笔记(一百二十八)手机制式适配
查看运营商与网络类型 虽然现在4G网络很普及了,但是我国幅员辽阔,4G信号在某些地方接收不良,手机连接很容易掉到3G甚至2G网络.为了让用户在低速环境也能使用App的基础功能,而不至于还在老牛破车地缓 ...
- Android 解决双卡双待手机解析短信异常
开发中,难免会遇到各种各样的适配问题,尤其是经过深度修改定制过的系统,有的无论是软硬件上都有很大的区别,这里不得不提到一种奇葩的机型,没错,那就是双卡双待的手机(比如XT800, A60, S8600 ...
- Android Q 获取设备唯一ID(UDID\GUID\UUID\SSAID\GAID)
Android Q获取设备唯一ID(UDID\GUID\UUID\SSAID\GAID) 一.简介 1.1 问题背景 1.2 关键技术 二.解决方案 2.1 谷歌官方推荐方案 (4种) 2.2 实现方 ...
- Android 获取 唯一GUID ,替换 IMEI (兼容 Android 10+获取IMEI问题)
Android 获取 唯一UUID ,替换 IMEI (兼容 Android 10+获取IMEI问题) 背景 关于 保存GUID方案 第一种,SharedPreferemces存储 第二种,sqlit ...
- Android适配 获取手机屏幕的分辨率
如何将一个应用程序适配在不同的手机上,虽然这不算是一个技术问题,但是对于刚刚做屏幕的开发人员来说,还真不是一件多么简单的事情. 首先:你需要在AndroidManifest.xml文件的<man ...
最新文章
- rust 手动关闭子线程_从零开始写 OS (9) —— 内核线程
- Oracle入门心得(2)
- java super()方法_Java super关键字的使用方法详解
- 大湾区|Serverless 线下活动两连发
- java编程button_以编程方式在Java Swing中单击GUIbutton
- Linux搭建Node.js环境
- Synchronized和Lock的区别
- 使用Maven配置JBoss / Wildfly数据源
- 低秩矩阵分解 matlab,低秩分解的matlab代码看不懂,分解的两个矩阵在哪呀??...
- java搭建聊天服务器_使用 ServerSocket 建立聊天服务器-2
- [LeetCode]15. 3Sum
- 优秀的人都有一个共同点
- Masonry 控件详解
- Centos 安装 L2tp
- 史上最全的全国特产一览表,到哪就买当地最正宗的特产!!!
- Linkedin领英如何批量撤回邀请
- 听歌识曲也太牛了吧!只“音”奥秘在此……
- 常用颜色的RGB分布
- 什么是jQuery,jQuery的特点。
- “不负热AI 不负7待”,萨摩耶云的新航海之路
热门文章
- Python-Django毕业设计服装销售商城系统(程序+Lw)
- jQuery删除,添加节点
- 判断一个整数是否为素数算法
- JUC-JUC三大辅助类
- 笔记本合上盖子后无法唤醒?
- 如何关闭ie安全设置提示(关闭ie的安全警告)
- 谷牛期权涨跌参半 原油、燃油涨潮1%
- Spark报错:The pivot column feature has more than 10000 distinct values
- 牟合方盖matlab,牟合方盖(中国古代智慧的结晶)【图文】
- Jupyter Notebook中的Markdown单元格(1)段落-标题-分隔线