前言:
关于双卡双待这个问题,调研了几个月终于有所进展,通过收集各方面的资料,整理出了这个文档。~~╭(╯^╰)╮
1.获取双卡的subId
方法1:
/**
* @param slotId:卡槽的序号:0代表卡槽1,1代表卡槽2
* @param context:上下文
* @return:subId(可以理解为sim卡的索引)
*/
public static int getSubId(int slotId, Context context) {
Uri uri = Uri.parse("content://telephony/siminfo");
Cursor cursor = null;
ContentResolver contentResolver = context.getContentResolver();
try {
cursor = contentResolver.query(uri, new String[] {"_id", "sim_id"}, "sim_id = ?", new String[] {String.valueOf(slotId)}, null);
if (null != cursor) {
if (cursor.moveToFirst()) {
return cursor.getInt(cursor.getColumnIndex("_id"));
}
}
} catch (Exception e) {
} finally {
if (null != cursor) {
cursor.close();
}
}
return -1;
}
使用:
tv_subId1.setText(getSubId(0,this)+"");//卡1
tv_subId2.setText(getSubId(1,this)+"");//卡2
方法2:
List<SubscriptionInfo> list = new ArrayList<>();
//获取SubscriptionManager对象
SubscriptionManager sm = SubscriptionManager.from(this);
list = sm.getActiveSubscriptionInfoList();//获取所有sim卡的信息集合
SubscriptionInfo info1 = list.get(0);//卡1的sim卡信息
SubscriptionInfo info2 = list.get(1);//卡2的sim卡信息
使用:
tv_subId1.setText(info1.getSubscriptionId()+"");
tv_subId2.setText(info2.getSubscriptionId()+"");
2. 获取SIM卡数量
//获取TelephonyManager实例对象
TelephonyManager tm = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
int simCount = tm.getPhoneCount();//sim卡数量(1:一张sim卡;2:2张sim卡)
3. sim卡信息
List<SubscriptionInfo> list = new ArrayList<>();
//获取SubscriptionManager对象
SubscriptionManager sm = SubscriptionManager.from(this);
list = sm.getActiveSubscriptionInfoList();//获取所有sim卡的信息集合
SubscriptionInfo info1 = list.get(0);//卡1的sim卡信息
SubscriptionInfo info2 = list.get(1);//卡2的sim卡信息
使用:
TextView tv_info1.setText(info.toString());
sim卡信息格式:
java
{
id=2,
iccId=898600640XXXXXXXXXXX,
simSlotIndex=0,
displayName=CMCC,
carrierName=CMCC,
nameSource=0,
iconTint=-13408298,
dataRoaming=0,
iconBitmap=android.graphics.Bitmap@93022a4,
mcc 460,
mnc 0,
mStatus=1,
mNwMode=-1
}
4.双卡的IMSI
1.解释:
IMSI:即国际移动用户识别码,有15数字,由三部分组成:
①mcc:国家码(460)
②mnc:网络码(联通:01;移动:00、02;电信:03)
③min:10位长度
例:460003311452284
2.获取方法
方法1:
//获取SubscriptionManager对象
SubscriptionManager sm = SubscriptionManager.from(this);
//IMSI
String IMSI1 = tm.getSubscriberId();//卡1
方法2:
//imsi
private String getSubscriberId(SubscriptionInfo sir) {
if (sir == null) {
return null;
}
return getSubscriberId(sir.getSubscriptionId());
}
使用:
List<SubscriptionInfo> list = new ArrayList<>();
//获取SubscriptionManager对象
SubscriptionManager sm = SubscriptionManager.from(this);
list = sm.getActiveSubscriptionInfoList();//获取所有sim卡的信息集合
SubscriptionInfo info1 = list.get(0);//卡1的sim卡信息
SubscriptionInfo info2 = list.get(1);//卡2的sim卡信息
String IMSI1=getSubscriberId(info1);//卡1
String IMSI2=getSubscriberId(info2);//卡2
5.双卡的IMEI
1.解释:
IMEI:国际移动设备标识,15位长度
2.获取方法
/**
* @param context:上下文
* @param soltId:卡槽的序号,0代表卡槽1;1代表卡槽2
* @return
*/
public static String getDeviced(Context context, int soltId) {
return (String) getPhoneInfo(soltId, "getDeviceId", context);
}
//通过subId和方法名来获取该方法的返回值
public static Object getPhoneInfo(int subId, String methodName, Context context) {
Object value = null;
try {
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
if (Build.VERSION.SDK_INT >= 21) {
Method method = tm.getClass().getMethod(methodName, getMethodParamTypes(methodName));
if (subId >= 0) {
value = method.invoke(tm, subId);
}
}
} catch (Exception e) {
}
return value;
}
//通过方法名来获取方法的参数列表
public static Class[] getMethodParamTypes(String methodName) {
Class[] params = null;
try {
Method[] methods = TelephonyManager.class.getDeclaredMethods();
for (int i = 0; i < methods.length; i++) {
if (methodName.equals(methods[i].getName())) {
params = methods[i].getParameterTypes();
if (params.length >= 1) {
//LogUtil.d("length:", "" + params.length);
break;
}
}
}
} catch (Exception e) {
}
return params;
}
3.使用:
TextView tv_imei1.setText(getDeviced(this,info.getSimSlotIndex())+"");//卡1
TextView tv_imei2.setText(getDeviced(this,info2.getSimSlotIndex())+"");//卡2
注:这里的info和info2都为获取sim卡信息中的值
6.获取双卡的服务提供商
1.获取方法:
方法1:
//获取TelephonyManager实例对象
TelephonyManager tm = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
//获取服务提供商的名字
String SPN1 = tm.getSimOperatorName();//卡1
方法2:
/**
* @param sir:sim卡的信息
* @return
*/
private String getSimOperatorName(SubscriptionInfo sir) {
if (sir == null) {
return null;
}
return getSimOperatorName(sir.getSubscriptionId());
}
private String getSimOperatorName(int subId) {
String simOperatorName = null;
try {
Method method = TelephonyManager.class.getDeclaredMethod("getSimOperatorNameForSubscription", int.class);
simOperatorName = (String) method.invoke(tm, subId);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return simOperatorName;
}
使用:
String SPN1 = getSimOperatorName(info1);
String SPN2 = getSimOperatorName(info2);
注:此处的info1和info2均来自获取sim卡信息的值
7.获取sim卡的卡槽
获取方法:
List<SubscriptionInfo> list = new ArrayList<>();
//获取SubscriptionManager对象
SubscriptionManager sm = SubscriptionManager.from(this);
list = sm.getActiveSubscriptionInfoList();//获取所有sim卡的信息集合
SubscriptionInfo info1 = list.get(0);//卡1的sim卡信息
SubscriptionInfo info2 = list.get(1);//卡2的sim卡信息
//获取卡槽slotId
int slotId1 = info1.getSimSlotIndex();
int slotId2 = info2.getSimSlotIndex();
8.获取sim卡的手机号码
方法1(只能获取到卡1的号码)
TelephonyManager tm = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);
String te1 = tm.getLine1Number();//获取卡1的号码
方法2:
//获取双卡的手机号码
public static String getNumber(int slotId,Context context){
Uri uri = Uri.parse("content://telephony/siminfo");
Cursor cursor = null;
ContentResolver contentResolver = context.getContentResolver();
try {
cursor = contentResolver.query(uri, new String[] {"number", "sim_id"}, "sim_id = ?", new String[] {String.valueOf(slotId)}, null);
if (null != cursor) {
if (cursor.moveToFirst()) {
String num = cursor.getString(cursor.getColumnIndex("number"));
Log.e("cursor","num为:"+num);
return num;
}
}
} catch (Exception e) {
} finally {
if (null != cursor) {
cursor.close();
}
}
return null;
}
小结:
这一部分为基础知识,在实际开发中不一定会用到。请看双卡双待(二)