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卡序列号。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。