热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android获取双卡双待手机的SIM卡信息示例代码

这篇文章主要给大家介绍了关于Android获取双卡双待手机的SIM卡信息的相关资料,文中通过示例代码介绍的非常详细,对各位Android开发者们具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。

前言

需要验证手机号的功能,但是国内的手机多是双卡双待的,无法获取到两个号码。在Android的官方文档是没有提供相应的Api的,因为标准的Andoird是没有双卡的,好像也只有国内才会搞双卡双待的神器吧。

以下记录一下做这个功能所学习到的东西。

Android 获取本机手机号(适用于双卡双待手机)

直接上代码:

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

} 

当然不要忘记添加权限:

获取双卡双待手机SIM卡信息

使用反射遍历 TelephonyManager 中的方法,通过肉眼基本能找到获取双卡双待号码的方法,最后通过反射取到 SIM 卡信息。

// 遍历 TelephonyManager 里的方法
public void printTelephonyManagerMethodNamesForThisDevice() {
 TelephonyManager telephOny= (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
 Class<&#63;> telephonyClass;
 try {
  telephOnyClass= Class.forName(telephony.getClass().getName());
  Method[] methods = telephonyClass.getMethods();
  for (int i = 0; i  telephonyClass;
 Object result = null;
 Object result0 = null;
 Object result1 = null;
 try {
  telephOnyClass= Class.forName(telephony.getClass().getName());
  Method m1 = telephonyClass.getMethod("getSubscriberId");
  Method m2 = telephonyClass.getMethod("getSubscriberId", new Class[]{int.class});
  result = m1.invoke(telephony);
  result0 = m2.invoke(telephony, 0);
  result1 = m2.invoke(telephony, 1);
 } catch (Exception e) {
  e.printStackTrace();
 }
 Log.i(TAG, " getSubscriberId : " + telephony.getSubscriberId() + "\n"
   + " result : " + result + "\n"
   + " result0 : " + result0 + "\n"
   + " result1 : " + result1 + "\n");
}

是否能取到手机号,取决于手机卡,而大部分手机卡都取不到手机号码,只能取到 SIM 卡序列号。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。


推荐阅读
  • 本文详细介绍了如何在Python3环境中配置Appium1.4.6,并指导如何连接模拟器进行自动化测试。通过本文,您将了解从环境搭建到模拟器连接的完整流程。 ... [详细]
  • CentOS 7.2 配置防火墙端口开放
    本文介绍如何在 CentOS 7.2 系统上配置防火墙以开放特定的服务端口,包括 FTP 服务的临时与永久开放方法,以及如何验证配置是否生效。 ... [详细]
  • Ubuntu GamePack:专为游戏爱好者打造的Linux发行版
    随着Linux系统在游戏领域的应用越来越广泛,许多Linux用户开始寻求在自己的系统上畅玩游戏的方法。UALinux,一家致力于推广GNU/Linux使用的乌克兰公司,推出了基于Ubuntu 16.04的Ubuntu GamePack,旨在为Linux用户提供一个游戏友好型的操作环境。 ... [详细]
  • MySQL锁机制详解
    本文深入探讨了MySQL中的锁机制,包括表级锁、行级锁以及元数据锁,通过实例详细解释了各种锁的工作原理及其应用场景。同时,文章还介绍了如何通过锁来优化数据库性能,避免常见的并发问题。 ... [详细]
  • 本文探讨了如何利用SqlDependency执行复杂的SQL查询,并确保在多线程环境下的安全性与效率。 ... [详细]
  • Python数据类型6 字典
    字典Python的字典数据类型是基于hash散列算法实现的,采用键值对(key:value)的形式,根据key的值计算value的地址,具有非常快的查取和插入速度。但它是无序的,包 ... [详细]
  • 本文详细介绍了ActivityManagerService (AMS) 的工作原理及其在Android系统中的重要角色。AMS作为system_server进程的一部分,在系统启动时加载,负责管理和协调应用程序中的Activity和服务(Service)。文章将通过具体的接口图和通信流程,帮助读者更好地理解AMS的工作机制。 ... [详细]
  • EasyMock实战指南
    本文介绍了如何使用EasyMock进行单元测试,特别是当测试对象的合作者依赖于外部资源或尚未实现时。通过具体的示例,展示了EasyMock在模拟对象行为方面的强大功能。 ... [详细]
  • 题目 CF1245F: 清理春天的数学挑战 描述了一个数学问题:给定一个区间 [L, R](0 ≤ L, R ≤ 10^9),求该区间内满足 x + y = x ∧ y 的数对 (x, y) 的总数。 ... [详细]
  • 探讨在Android JNI/NDK环境中遇到的SIGSEGV崩溃问题,以及如何通过自定义信号处理器进行调试的方法。 ... [详细]
  • 三星Galaxy S8/S8+即将登场,全面解析新旗舰
    3月29日晚11点,备受瞩目的三星Galaxy S8/S8+将正式发布。作为三星在Note 7爆炸事件后的重磅产品,S8/S8+不仅承载着恢复消费者信心的重任,其创新的设计和技术也备受期待。 ... [详细]
  • 本文详细介绍了在使用Socket进行网络编程时,遇到链接器错误`undefined reference to WSAStartup@8`的解决方案,适用于多种开发环境。 ... [详细]
  • 深入解析Android中的SQLite数据库使用
    本文详细介绍了如何在Android应用中使用SQLite数据库进行数据存储。通过自定义类继承SQLiteOpenHelper,实现数据库的创建与版本管理,并提供了具体的学生信息管理示例代码。 ... [详细]
  • LCUI 2.1.0 版本现已推出,这是一个用 C 语言编写的图形用户界面开发库,适合创建轻量级的桌面应用程序。此次更新包括多项修复和功能增强,并正式宣布将启动 Android 支持的开发计划。 ... [详细]
  • Android手机用户如何轻松连接蓝牙耳机
    对于拥有Android智能手机的用户来说,连接蓝牙耳机不仅操作简便,还能极大地提升日常听音乐、通话或游戏体验的质量。 ... [详细]
author-avatar
nowemf
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有