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卡 系统设定的默认卡两种讨论