1. 程式人生 > >android MTK SIM雙卡,apn,subid和slotid相關

android MTK SIM雙卡,apn,subid和slotid相關

之前一個專案的需要是需要開啟MTK系統的apn設定的頁面涉及到subid的

大概瞭解下android的sim卡相關,

   Intent intent =  new Intent(Settings.ACTION_APN_SETTINGS);  
 startActivity(intent);
正常只要這麼寫就是可以的,但是在mtk 5.0以後平臺的情況下會閃退,高通的裝置也是可以的

翻了下原始碼,開啟頁面的時候 傳了個subid 的引數

後來查了下資料,改成這麼跳轉了

  Intent apnintent = new Intent(Settings.ACTION_APN_SETTINGS);
            try {
                Class<?> classType = SubscriptionManager.class;
               	Method getMethod = classType.getDeclaredMethod("getSubId", int.class);
              	int []   values = (int []) getMethod.invoke(classType, 0);  //0代表當前卡插在卡槽1當中(主卡槽),1代表當前卡插在卡槽2當中(副卡槽),-1代表曾經手機插入過此卡,現在已經移除
 apnintent.putExtra("sub_id", values );
            } catch (Exception e) {
                e.printStackTrace();
            }

瞭解到

subid的意思是,你放在sim的進去卡槽的時候存在資料庫的編號的計數,你放過10張不同的sim卡,就有可能這個id 是9,
slotid的意思0代表當前卡插在卡槽1當中(主卡槽),1代表當前卡插在卡槽2當中(副卡槽),-1代表曾經手機插入過此卡,現在已經移除

在單卡的裝置直接引數是0是沒有問題的,在後面的專案是雙卡的裝置的時候,就不能確認當前的網路的卡是哪張卡了。

參考(http://blog.csdn.net/firedancer0089/article/details/59518976)

一開始是通過反射去

public int getDefaultDataPhoneId()  預設資料slotId
public static int getDefaultDataSubscriptionId() 預設資料subId


public int getDefaultSmsPhoneId()  預設簡訊slotId 

public static int getDefaultSmsSubscriptionId() 預設簡訊subId


public static int getDefaultVoicePhoneId()  預設通話slotId
public static int getDefaultVoiceSubscriptionId() 預設通話subId

public static int getDefaultSubscriptionId() 獲取預設subId,上述三個都返回-1的話使用這個

獲取這幾個函式

發覺這幾個函式除了getSubId 之外都發現不到方法,但是在原始碼都能找到,很莫名奇怪

後來查資料 找到另外一種通過aidl的方法(參考 http://blog.csdn.net/linsir007/article/details/51918227)

  Intent apnintent = new Intent(Settings.ACTION_APN_SETTINGS);
            try {
                Class<?> classType = SubscriptionManager.class;
                //	Method getMethod = classType.getDeclaredMethod("getSubId", int.class);
                //	int []   values = (int []) getMethod.invoke(classType, 0);  //0代表當前卡插在卡槽1當中(主卡槽),1代表當前卡插在卡槽2當中(副卡槽),-1代表曾經手機插入過此卡,現在已經移除

                int DataSubId = getISub().getDefaultDataSubId();
                int VoiceSubId = getISub().getDefaultVoiceSubId();
                int SmsSubId = getISub().getDefaultSmsSubId();
                int[] ActiveSubIdList = getISub().getActiveSubIdList();
                int DefaultSubId = getISub().getDefaultSubId();

                //  int values = (int) getMethod.invoke(classType);  //0代表當前卡插在卡槽1當中(主卡槽),1代表當前卡插在卡槽2當中(副卡槽),-1代表曾經手機插入過此卡,現在已經移除
                apnintent.putExtra("sub_id", DefaultSubId);
                int shoid =getISub().getSlotId(DefaultSubId);
                Log.d("zzx", "shotid= "+shoid);
                Log.d("zzx", " DefaultDataSubId= " + DataSubId + " VoiceSubId=" + VoiceSubId + " SmsSubId=" + SmsSubId + " ActiveSubIdList=" + ActiveSubIdList.toString() + " DefaultSubId=" + DefaultSubId);
            } catch (Exception e) {
                e.printStackTrace();
            }
            startActivity(apnintent);

   private ISub getISub() {

        try {
            return ISub.Stub.asInterface((IBinder) Class.forName("android.os.ServiceManager").getMethod("getService", String.class).invoke(null, "isub"));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
就可以判斷到當前的sim卡是哪個,並且傳到引數

android雙卡相關的,我看了下 基本都是從這個aidl能拿到方法。

怎麼用aidl就不介紹啦。

apn相關的可以參考這個流程 http://blog.csdn.net/gaugamela/article/details/53199141