MTK 平台下擷取SIM卡資訊
此處分析僅分析雙卡雙待,單卡可使用android API 讀取(不作分析) 這裡的分析,隻給出源碼了解思路,普通應用開發不适宜
import com.mediatek.encapsulation.android.telephony.EncapsulatedTelephony;
import com.mediatek.encapsulation.android.telephony.EncapsulatedTelephony.SIMInfo;
很顯然不用懷疑,MTK已經對SIMInfo做好了封裝,我們隻需要讀取
就那最有可能做出雙卡雙待選擇使用的短信Mms.apk發送應用來看 這裡具體的應用不做過多分析,有時間下次會寫出來 我們進入到 com.android.mms.ui.ComposeMessageActivity
千萬不要小看了這個Activity,這是android短信應用編輯發送短信最核心界面 還有一個是com.android.mms.ui.ConversationList毫不誇張的說,這兩個 Activity構成了短信應用
好了 我們進入到 ComposeMessageActivity 在onCreate()函數下
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
.......
......
/// M: Code analyze 007, Get information from Sim or save message to Sim.(Get all SIM info) @{
mGetSimInfoRunnable.run();
/// M:
}
很顯然 MTK很聰明的加入了自己的部分
Runnable mGetSimInfoRunnable = new Runnable() {
public void run() {
getSimInfoList();
mUiHandler.sendEmptyMessage(MessageUtils.UPDATE_SENDBUTTON);
}};
private void getSimInfoList() {
mSimInfoList = SIMInfo.getInsertedSIMList(this);
mSimCount = mSimInfoList.isEmpty()? 0: mSimInfoList.size();
}
初始化之後我們已經知道了SIMInfo那麼接下來需要的就是知道要怎麼處理關聯
public void onClick(View v) {
if (v == mSendButtonSms || v == mSendButtonMms || v == mSendButtonIpMessage) {
。。。。。
。。。。。
checkRecipientsCount();
...............
}
}
private void checkRecipientsCount() {
.......
simSelection();
.....}
簡單解釋一下以上兩個函數,首先檢查收件人是否為空(checkRecipientsCount()),相應的就是選擇收件人呢
private void simSelection() {
if (EncapsulatedFeatureOption.MTK_GEMINI_SUPPORT == false) {
confirmSendMessageIfNeeded();
} else if (mSimCount == 0) {
} else if (send_sim_id >= 1) {
mSelectedSimId = send_sim_id;
send_sim_id = -1;
confirmSendMessageIfNeeded();
} else if (mSimCount == 1) {
mSelectedSimId = (int) mSimInfoList.get(0).getSimId();
confirmSendMessageIfNeeded();
} else if (mSimCount > 1) {// multi sim cards exist.
Intent intent = new Intent();
mSelectSimType = SIM_SELECT_FOR_SEND_MSG;
intent.putExtra(SELECT_TYPE, SIM_SELECT_FOR_SEND_MSG);
if (isRecipientsEditorVisible()) {
if (mRecipientsEditor.getRecipientCount() == 1/*isOnlyOneRecipient()*/) {
mAssociatedSimId = getContactSIM(mRecipientsEditor.getNumbers().get(0));
} else {
mAssociatedSimId = -1;
}
} else {
if (getRecipients().size() == 1/*isOnlyOneRecipient()*/) {
mAssociatedSimId = getContactSIM(getRecipients().get(0).getNumber())
} else {
mAssociatedSimId = -1;
}
mMessageSimId = EncapsulatedSettings.System.getLong(getContentResolver(),
EncapsulatedSettings.System.SMS_SIM_SETTING, EncapsulatedSettings.System.DEFAULT_SIM_NOT_SET);
if (mMessageSimId == EncapsulatedSettings.System.DEFAULT_SIM_SETTING_ALWAYS_ASK ||(mMessageSimId == EncapsulatedSettings.System.SMS_SIM_SETTING_AUTO && MmsConfig.getFolderModeEnabled())) {
showSimSelectedDialog(intent);
updateSendButtonState();
} else if (mMessageSimId == EncapsulatedSettings.System.DEFAULT_SIM_NOT_SET) {
if (mAssociatedSimId == -1) {
showSimSelectedDialog(intent);
updateSendButtonState();
} else {
mSelectedSimId = mAssociatedSimId;
confirmSendMessageIfNeeded();
}
} else {
//DEFAULT SIM
if (mAssociatedSimId == -1 || (mMessageSimId == mAssociatedSimId)) {
.....
}
}
}
}
上面函數,稍作解釋 如果沒有卡,就提示 如果隻有一張卡,就預設 如果有2張卡 就分為與收件人關聯的SIM卡 系統設定的預設卡兩種讨論