前言:
關於雙卡雙待這個問題,調研了幾個月終於有所進展,通過收集各方面的資料,整理出了這個文檔。~~╭(╯^╰)╮
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;
}
小結:
這一部分爲基礎知識,在實際開發中不一定會用到。請看雙卡雙待(二)