雙卡雙待(一)

前言:

關於雙卡雙待這個問題,調研了幾個月終於有所進展,通過收集各方面的資料,整理出了這個文檔。~~╭(╯^╰)╮

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;
    }

小結:

這一部分爲基礎知識,在實際開發中不一定會用到。請看雙卡雙待(二)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章