Android获取双卡双待手机的SIM卡信息示例代码
前言
需要验证手机号的功能,但是国内的手机多是双卡双待的,无法获取到两个号码。在Android的官方文档是没有提供相应的Api的,因为标准的Andoird是没有双卡的,好像也只有国内才会搞双卡双待的神器吧。
以下记录一下做这个功能所学习到的东西。
Android获取本机手机号(适用于双卡双待手机)
直接上代码:
importjava.lang.reflect.InvocationTargetException;
importjava.lang.reflect.Method;
importjava.util.List;
importandroid.app.Activity;
importandroid.content.Context;
importandroid.content.SharedPreferences;
importandroid.content.SharedPreferences.Editor;
importandroid.os.Bundle;
importandroid.preference.PreferenceManager;
importandroid.telephony.CellInfo;
importandroid.telephony.TelephonyManager;
importandroid.view.Menu;
importandroid.widget.TextView;
publicclassMainActivityextendsActivity
{
privateTextViewtv;
privateTextViewtv2;
/////////////////////////////////////
staticStringISDOUBLE;
staticStringSIMCARD;
staticStringSIMCARD_1;
staticStringSIMCARD_2;
staticbooleanisDouble;
////////////////////////////////////
@Override
protectedvoidonCreate(BundlesavedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv=(TextView)findViewById(R.id.text);
tv2=(TextView)findViewById(R.id.text2);
tv2.setText("不知道哪个卡可用!");
getNumber();
}
privatevoidgetNumber()
{
TelephonyManagertm=(TelephonyManager)this.getSystemService(this.TELEPHONY_SERVICE);
StringphoneNumber1=tm.getLine1Number();
//StringphoneNumber2=tm.getGroupIdLevel1();
initIsDoubleTelephone(this);
if(isDouble)
{
//tv.setText("这是双卡手机!");
tv.setText("本机号码是:"+""+phoneNumber1+""+"这是双卡手机!");
}else
{
//tv.setText("这是单卡手机");
tv.setText("本机号码是:"+""+phoneNumber1+""+"这是单卡手机");
}
}
publicvoidinitIsDoubleTelephone(Contextcontext)
{
isDouble=true;
Methodmethod=null;
Objectresult_0=null;
Objectresult_1=null;
TelephonyManagertm=(TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
try
{
//只要在反射getSimStateGemini这个函数时报了错就是单卡手机(这是我自己的经验,不一定全正确)
method=TelephonyManager.class.getMethod("getSimStateGemini",newClass[]
{int.class});
//获取SIM卡1
result_0=method.invoke(tm,newObject[]
{newInteger(0)});
//获取SIM卡2
result_1=method.invoke(tm,newObject[]
{newInteger(1)});
}catch(SecurityExceptione)
{
isDouble=false;
e.printStackTrace();
//System.out.println("1_ISSINGLETELEPHONE:"+e.toString());
}catch(NoSuchMethodExceptione)
{
isDouble=false;
e.printStackTrace();
//System.out.println("2_ISSINGLETELEPHONE:"+e.toString());
}catch(IllegalArgumentExceptione)
{
isDouble=false;
e.printStackTrace();
}catch(IllegalAccessExceptione)
{
isDouble=false;
e.printStackTrace();
}catch(InvocationTargetExceptione)
{
isDouble=false;
e.printStackTrace();
}catch(Exceptione)
{
isDouble=false;
e.printStackTrace();
//System.out.println("3_ISSINGLETELEPHONE:"+e.toString());
}
SharedPreferencessp=PreferenceManager.getDefaultSharedPreferences(context);
Editoreditor=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("双卡可用");
}elseif(!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("卡二可用");
}elseif(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
publicbooleanonCreateOptionsMenu(Menumenu)
{
//Inflatethemenu;thisaddsitemstotheactionbarifitispresent.
getMenuInflater().inflate(R.menu.main,menu);
returntrue;
}
}
当然不要忘记添加权限:
获取双卡双待手机SIM卡信息
使用反射遍历TelephonyManager中的方法,通过肉眼基本能找到获取双卡双待号码的方法,最后通过反射取到SIM卡信息。
//遍历TelephonyManager里的方法
publicvoidprintTelephonyManagerMethodNamesForThisDevice(){
TelephonyManagertelephony=(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
Class>telephonyClass;
try{
telephonyClass=Class.forName(telephony.getClass().getName());
Method[]methods=telephonyClass.getMethods();
for(inti=0;itelephonyClass;
Objectresult=null;
Objectresult0=null;
Objectresult1=null;
try{
telephonyClass=Class.forName(telephony.getClass().getName());
Methodm1=telephonyClass.getMethod("getSubscriberId");
Methodm2=telephonyClass.getMethod("getSubscriberId",newClass[]{int.class});
result=m1.invoke(telephony);
result0=m2.invoke(telephony,0);
result1=m2.invoke(telephony,1);
}catch(Exceptione){
e.printStackTrace();
}
Log.i(TAG,"getSubscriberId:"+telephony.getSubscriberId()+"\n"
+"result:"+result+"\n"
+"result0:"+result0+"\n"
+"result1:"+result1+"\n");
}
是否能取到手机号,取决于手机卡,而大部分手机卡都取不到手机号码,只能取到SIM卡序列号。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。