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

前言

需要验证手机号的功能,但是国内的手机多是双卡双待的,无法获取到两个号码。在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;
 } 

} 

当然不要忘记添加权限:

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

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

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

// 遍历 TelephonyManager 里的方法
public void printTelephonyManagerMethodNamesForThisDevice() {
 TelephonyManager telephony = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
 Class<?> telephonyClass;
 try {
  telephonyClass = Class.forName(telephony.getClass().getName());
  Method[] methods = telephonyClass.getMethods();
  for (int i = 0; i < methods.length; i++) {
   Log.i(TAG, "\n" + methods[i] + " declared by " + methods[i].getDeclaringClass());
  }
 } catch (ClassNotFoundException e) {
  e.printStackTrace();
 }
}
// 获取双卡双待 SIM 卡序列号
public void getSubscriberId() {
 TelephonyManager telephony = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
 Class<?> 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 卡序列号。

总结

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

(0)

相关推荐

  • Android4.X读取SIM卡短信和联系人相关类实例分析

    本文实例讲述了Android4.X读取SIM卡短信和联系人相关类.分享给大家供大家参考,具体如下: 1. IccSmsInterfaceManager 这个类的主要作用有两个 <1>通过 SMSDispatcher,发送短信数据 <2>更新和查询SIM卡的短信数据 IccSmsInterfaceManager 是一个Binder 服务类,Binder接口是 ISms. IccSmsInterfaceManager 被创造时 Binder服务会被注册. IccSmsInterface

  • Android4.X中SIM卡信息初始化过程详解

    本文实例讲述了Android4.X中SIM卡信息初始化过程详解.分享给大家供大家参考,具体如下: Phone 对象初始化的过程中,会加载SIM卡的部分数据信息,这些信息会保存在IccRecords 和 AdnRecordCache 中.SIM卡的数据信息的初始化过程主要分为如下几个步骤 1.RIL 和 UiccController 建立监听关系 ,SIM卡状态发生变化时,UiccController 第一个去处理. Phone 应用初始化 Phone 对象时会建立一个 RIL 和UiccCont

  • 浅析Android手机卫士sim卡绑定

    读取sim卡的序列号,保存起来,一旦sim发生变更了,认为是小偷的sim卡,发出警告 读取sim卡序列号 获取TelephonyManager对象,通过getSystemService(TELEPHONY_SERVICE) 调用TelephonyManager对象的getSimSerialNumber()方法,得到String类型的序列号 把序列号保存在SharedPreences里面 需要加权限 android.permission.READ_PHONE_STATE 检测sim卡是否变更 使用

  • android监控sim卡有没有服务示例(sim卡管理)

    复制代码 代码如下: public class UniteqService {public static final String LOG_TAG = "UniteqService";public boolean DEBUG = true;private boolean hasService = false;//是否有服务private PhoneStateListener[] mPhoneStateListener;//监听双卡private TelephonyManager mPh

  • Android 判断SIM卡是中国移动\中国联通\中国电信(移动运营商)

    第一种方法: 获取手机的IMSI码,并判断是中国移动\中国联通\中国电信 TelephonyManager telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); /** 获取SIM卡的IMSI码 * SIM卡唯一标识:IMSI 国际移动用户识别码(IMSI:International Mobile Subscriber Identification Number)是区别移动用户的标志, * 储存在

  • Android获取手机SIM卡运营商信息的方法

    本文实例讲述了Android获取手机SIM卡运营商信息的方法,对于Android程序设计有非常实用的价值.分享给大家供大家参考之用.具体方法如下: 主要功能代码如下: /** * 获取SIM卡运营商 * * @param context * @return */ public static String getOperators(Context context) { TelephonyManager tm = (TelephonyManager) context .getSystemServic

  • Android 判断SIM卡属于哪个移动运营商的实现代码

    复制代码 代码如下: [java]public String getProvidersName()  {    String str = "N/A";    try    {      this.IMSI = this.telephonyManager.getSubscriberId();      System.out.println(this.IMSI);      if (this.IMSI.startsWith("46000"))       str = &

  • Android获取手机通讯录、sim卡联系人及调用拨号界面方法

    android获取手机通讯录联系人信息 复制代码 代码如下: private void getPhoneContacts() {        ContentResolver resolver = this.getContentResolver();                // 获取手机联系人       Cursor phoneCursor = resolver.query(Phone.CONTENT_URI,                  new String[] { Phone

  • Android 判断SIM卡属于哪个移动运营商详解及实例

    Android 判断SIM卡属于哪个移动运营商 第一种方法: 获取手机的IMSI码,并判断是中国移动\中国联通\中国电信 TelephonyManager telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); /** 获取SIM卡的IMSI码 * SIM卡唯一标识:IMSI 国际移动用户识别码(IMSI:International Mobile Subscriber Identification

  • Android读取用户号码,手机串号,SIM卡序列号的实现代码

    1.使用TelephonyManager提供的方法,核心代码: 复制代码 代码如下: TelephonyManager tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);String imei = tm.getDeviceId();       //取出IMEILog.d(TAG, "IMEI:"+imei);String tel = tm.getLine1Number();     //取出MSISDN,

随机推荐