2023年12月11日发(作者:喜勇锐)
Android获取双卡双待手机的SIM卡信息示例代码
前言
需要验证手机号的功能,但是国内的手机多是双卡双待的,无法获取到两个号码。在Android的官方文档是没有提供相应的Api
的,因为标准的Andoird是没有双卡的,好像也只有国内才会搞双卡双待的神器吧。
以下记录一下做这个功能所学习到的东西。
Android 获取本机手机号(适用于双卡双待手机)
直接上代码:
import tionTargetException;
import ;
import ;
import ty;
import t;
import Preferences;
import ;
import ;
import enceManager;
import fo;
import onyManager;
import ;
import ew;
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)
{
te(savedInstanceState);
setContentView(ty_main);
tv = (TextView) findViewById();
tv2 = (TextView) findViewById(2);
t("不知道哪个卡可用!");
getNumber();
}
private void getNumber()
{
TelephonyManager tm = (TelephonyManager) temService(ONY_SERVICE);
String phoneNumber1 = e1Number();
// String phoneNumber2 = upIdLevel1();
initIsDoubleTelephone(this);
if (isDouble)
{
// t("这是双卡手机!");
t("本机号码是:" + " " + phoneNumber1 + " " + "这是双卡手机!");
} else
{
// t("这是单卡手机");
t("本机号码是:" + " " + phoneNumber1 + " " + "这是单卡手机");
} }
public void initIsDoubleTelephone(Context context)
{
isDouble = true;
Method method = null;
Object result_0 = null;
Object result_1 = null;
TelephonyManager tm = (TelephonyManager) temService(ONY_SERVICE);
try
{
// 只要在反射getSimStateGemini 这个函数时报了错就是单卡手机(这是我自己的经验,不一定全正确)
method = hod("getSimStateGemini", new Class[]
{ });
// 获取SIM卡1
result_0 = (tm, new Object[]
{ new Integer(0) });
// 获取SIM卡2
result_1 = (tm, new Object[]
{ new Integer(1) });
} catch (SecurityException e)
{
isDouble = false;
tackTrace();
// n("1_ISSINGLETELEPHONE:"+ng());
} catch (NoSuchMethodException e)
{
isDouble = false;
tackTrace();
// n("2_ISSINGLETELEPHONE:"+ng());
} catch (IllegalArgumentException e)
{
isDouble = false;
tackTrace();
} catch (IllegalAccessException e)
{
isDouble = false;
tackTrace();
} catch (InvocationTargetException e)
{
isDouble = false;
tackTrace();
} catch (Exception e)
{
isDouble = false;
tackTrace();
// n("3_ISSINGLETELEPHONE:"+ng());
}
SharedPreferences sp = aultSharedPreferences(context);
Editor editor = ();
if (isDouble)
{
// 保存为双卡手机
lean(ISDOUBLE, true);
// 保存双卡是否可用
// 如下判断哪个卡可用.双卡都可以用
if (result_ng().equals("5") && result_ng().equals("5"))
{
if (!ing(SIMCARD, "2").equals("0") && !ing(SIMCARD, "2").equals("1"))
{
ing(SIMCARD, "0");
}
lean(SIMCARD_1, true);
lean(SIMCARD_2, true);
t("双卡可用");
} else if (!result_ng().equals("5") && result_ng().equals("5"))
{// 卡二可用
if (!ing(SIMCARD, "2").equals("0") && !ing(SIMCARD, "2").equals("1"))
{
ing(SIMCARD, "1");
}
lean(SIMCARD_1, false);
lean(SIMCARD_2, true); t("卡二可用");
} else if (result_ng().equals("5") && !result_ng().equals("5"))
{// 卡一可用
if (!ing(SIMCARD, "2").equals("0") && !ing(SIMCARD, "2").equals("1"))
{
ing(SIMCARD, "0");
}
lean(SIMCARD_1, true);
lean(SIMCARD_2, false);
t("卡一可用");
} else
{// 两个卡都不可用(飞行模式会出现这种种情况)
lean(SIMCARD_1, false);
lean(SIMCARD_2, false);
t("飞行模式");
}
} else
{
// 保存为单卡手机
ing(SIMCARD, "0");
lean(ISDOUBLE, false);
}
();
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(, menu);
return true;
}
}
当然不要忘记添加权限:
获取双卡双待手机SIM卡信息
使用反射遍历 TelephonyManager 中的方法,通过肉眼基本能找到获取双卡双待号码的方法,最后通过反射取到 SIM 卡信
息。
// 遍历 TelephonyManager 里的方法
public void printTelephonyManagerMethodNamesForThisDevice() {
TelephonyManager telephony = (TelephonyManager) getSystemService(ONY_SERVICE);
Class> telephonyClass;
try {
telephonyClass = e(ss().getName());
Method[] methods = hods();
for (int i = 0; i < ; i++) {
Log.i(TAG, "n" + methods[i] + " declared by " + methods[i].getDeclaringClass());
}
} catch (ClassNotFoundException e) {
tackTrace();
}
}
// 获取双卡双待 SIM 卡序列号
public void getSubscriberId() {
TelephonyManager telephony = (TelephonyManager) getSystemService(ONY_SERVICE);
Class> telephonyClass;
Object result = null;
Object result0 = null;
Object result1 = null;
try {
telephonyClass = e(ss().getName());
Method m1 = hod("getSubscriberId");
Method m2 = hod("getSubscriberId", new Class[]{});
result = (telephony);
result0 = (telephony, 0); result1 = (telephony, 1);
} catch (Exception e) {
tackTrace();
}
Log.i(TAG, " getSubscriberId : " + scriberId() + "n"
+ " result : " + result + "n"
+ " result0 : " + result0 + "n"
+ " result1 : " + result1 + "n");
}
是否能取到手机号,取决于手机卡,而大部分手机卡都取不到手机号码,只能取到 SIM 卡序列号。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言
交流,谢谢大家对的支持。
2023年12月11日发(作者:喜勇锐)
Android获取双卡双待手机的SIM卡信息示例代码
前言
需要验证手机号的功能,但是国内的手机多是双卡双待的,无法获取到两个号码。在Android的官方文档是没有提供相应的Api
的,因为标准的Andoird是没有双卡的,好像也只有国内才会搞双卡双待的神器吧。
以下记录一下做这个功能所学习到的东西。
Android 获取本机手机号(适用于双卡双待手机)
直接上代码:
import tionTargetException;
import ;
import ;
import ty;
import t;
import Preferences;
import ;
import ;
import enceManager;
import fo;
import onyManager;
import ;
import ew;
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)
{
te(savedInstanceState);
setContentView(ty_main);
tv = (TextView) findViewById();
tv2 = (TextView) findViewById(2);
t("不知道哪个卡可用!");
getNumber();
}
private void getNumber()
{
TelephonyManager tm = (TelephonyManager) temService(ONY_SERVICE);
String phoneNumber1 = e1Number();
// String phoneNumber2 = upIdLevel1();
initIsDoubleTelephone(this);
if (isDouble)
{
// t("这是双卡手机!");
t("本机号码是:" + " " + phoneNumber1 + " " + "这是双卡手机!");
} else
{
// t("这是单卡手机");
t("本机号码是:" + " " + phoneNumber1 + " " + "这是单卡手机");
} }
public void initIsDoubleTelephone(Context context)
{
isDouble = true;
Method method = null;
Object result_0 = null;
Object result_1 = null;
TelephonyManager tm = (TelephonyManager) temService(ONY_SERVICE);
try
{
// 只要在反射getSimStateGemini 这个函数时报了错就是单卡手机(这是我自己的经验,不一定全正确)
method = hod("getSimStateGemini", new Class[]
{ });
// 获取SIM卡1
result_0 = (tm, new Object[]
{ new Integer(0) });
// 获取SIM卡2
result_1 = (tm, new Object[]
{ new Integer(1) });
} catch (SecurityException e)
{
isDouble = false;
tackTrace();
// n("1_ISSINGLETELEPHONE:"+ng());
} catch (NoSuchMethodException e)
{
isDouble = false;
tackTrace();
// n("2_ISSINGLETELEPHONE:"+ng());
} catch (IllegalArgumentException e)
{
isDouble = false;
tackTrace();
} catch (IllegalAccessException e)
{
isDouble = false;
tackTrace();
} catch (InvocationTargetException e)
{
isDouble = false;
tackTrace();
} catch (Exception e)
{
isDouble = false;
tackTrace();
// n("3_ISSINGLETELEPHONE:"+ng());
}
SharedPreferences sp = aultSharedPreferences(context);
Editor editor = ();
if (isDouble)
{
// 保存为双卡手机
lean(ISDOUBLE, true);
// 保存双卡是否可用
// 如下判断哪个卡可用.双卡都可以用
if (result_ng().equals("5") && result_ng().equals("5"))
{
if (!ing(SIMCARD, "2").equals("0") && !ing(SIMCARD, "2").equals("1"))
{
ing(SIMCARD, "0");
}
lean(SIMCARD_1, true);
lean(SIMCARD_2, true);
t("双卡可用");
} else if (!result_ng().equals("5") && result_ng().equals("5"))
{// 卡二可用
if (!ing(SIMCARD, "2").equals("0") && !ing(SIMCARD, "2").equals("1"))
{
ing(SIMCARD, "1");
}
lean(SIMCARD_1, false);
lean(SIMCARD_2, true); t("卡二可用");
} else if (result_ng().equals("5") && !result_ng().equals("5"))
{// 卡一可用
if (!ing(SIMCARD, "2").equals("0") && !ing(SIMCARD, "2").equals("1"))
{
ing(SIMCARD, "0");
}
lean(SIMCARD_1, true);
lean(SIMCARD_2, false);
t("卡一可用");
} else
{// 两个卡都不可用(飞行模式会出现这种种情况)
lean(SIMCARD_1, false);
lean(SIMCARD_2, false);
t("飞行模式");
}
} else
{
// 保存为单卡手机
ing(SIMCARD, "0");
lean(ISDOUBLE, false);
}
();
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(, menu);
return true;
}
}
当然不要忘记添加权限:
获取双卡双待手机SIM卡信息
使用反射遍历 TelephonyManager 中的方法,通过肉眼基本能找到获取双卡双待号码的方法,最后通过反射取到 SIM 卡信
息。
// 遍历 TelephonyManager 里的方法
public void printTelephonyManagerMethodNamesForThisDevice() {
TelephonyManager telephony = (TelephonyManager) getSystemService(ONY_SERVICE);
Class> telephonyClass;
try {
telephonyClass = e(ss().getName());
Method[] methods = hods();
for (int i = 0; i < ; i++) {
Log.i(TAG, "n" + methods[i] + " declared by " + methods[i].getDeclaringClass());
}
} catch (ClassNotFoundException e) {
tackTrace();
}
}
// 获取双卡双待 SIM 卡序列号
public void getSubscriberId() {
TelephonyManager telephony = (TelephonyManager) getSystemService(ONY_SERVICE);
Class> telephonyClass;
Object result = null;
Object result0 = null;
Object result1 = null;
try {
telephonyClass = e(ss().getName());
Method m1 = hod("getSubscriberId");
Method m2 = hod("getSubscriberId", new Class[]{});
result = (telephony);
result0 = (telephony, 0); result1 = (telephony, 1);
} catch (Exception e) {
tackTrace();
}
Log.i(TAG, " getSubscriberId : " + scriberId() + "n"
+ " result : " + result + "n"
+ " result0 : " + result0 + "n"
+ " result1 : " + result1 + "n");
}
是否能取到手机号,取决于手机卡,而大部分手机卡都取不到手机号码,只能取到 SIM 卡序列号。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言
交流,谢谢大家对的支持。