在我的apk中发出了这么一个intent :final Intent intent1 = new Intent(ACTION_DUAL_SIM_CALL, uri1);
然后在app里寻找 相应这个intent的activity:
<intent-filter>
<action android:name="com.intel.dualsim.ACTION_CALL" />
有三个在Phone里
<activity-alias android:name="PrivilegedOutgoingCallBroadcaster"
<activity android:name="OutgoingCallBroadcaster"
<activity-alias android:name="EmergencyOutgoingCallBroadcaster"
但是很可惜,看了log后发现那个选择用哪个phone的activity出现在outbroadcast之前,所以肯定不是Phone这个apk响应了这个intent而是别的activity,但是搜遍了所有的app发现还是这三个,说明这个选择的工作在原生的app里是在发这个intent之前就做了,于是就去看原生的app。
在DialpadFragment.java里发现了
case R.id.dialButton: {
Log.d("lisa","case R.id.dialButton:");
mHaptic.vibrate(); // Vibrate here too, just like we do for the regular keys
dialButtonPressed();
return;
}
case R.id.dialButton2: {
Log.d("lisa","case R.id.dialButton2:");
mHaptic.vibrate();
dialButtonPressed(DualSimConstants.DSDS_SLOT_2_ID);
return;
}
看dialButtonPressed(DualSimConstants.DSDS_SLOT_2_ID);
public void dialButtonPressed(int simIndex) {
if (isDigitsEmpty()) { // No number entered.
handleDialButtonClickWithEmptyDigits(simIndex);
} else {
final String number = mDigits.getText().toString();
// "persist.radio.otaspdial" is a temporary hack needed for one carrier's automated
// test equipment.
// TODO: clean it up.
if (number != null
&& !TextUtils.isEmpty(mProhibitedPhoneNumberRegexp)
&& number.matches(mProhibitedPhoneNumberRegexp)
&& (SystemProperties.getInt("persist.radio.otaspdial", 0) != 1)) {
Log.i(TAG, "The phone number is prohibited explicitly by a rule.");
if (getActivity() != null) {
DialogFragment dialogFragment = ErrorDialogFragment.newInstance(
R.string.dialog_phone_call_prohibited_message);
dialogFragment.show(getFragmentManager(), "phone_prohibited_dialog");
}
// Clear the digits just in case.
mDigits.getText().clear();
} else {
final Intent intent;
if (mIsDualSimSupported) {
Log.d("lisa---","dialpadfragment");
intent = CallUtil.getDualSimCallIntent(number, simIndex,
(getActivity() instanceof DialtactsActivity ?
((DialtactsActivity)getActivity()).getCallOrigin() : null));
} else {
intent = CallUtil.getCallIntent(number,
(getActivity() instanceof DialtactsActivity ?
((DialtactsActivity)getActivity()).getCallOrigin() : null));
}
startActivity(intent);
mClearDigitsOnStop = true;
getActivity().finish();
}
}
}
看起来和之前一样,并没有在intent里多加东西,所以说确实是在发intent之前就初始化phone。
而且验证得出的结论,挂电话和哪个phone没有关系,也就是选任意的com.android.phone都可以挂电话,但是和sim卡放在1还是2的位子上相关,也就是如果是在sim卡1插槽里的话,挂电话就必须用 matt=CallManager.getInstance();而卡2就必须用matt1 = CallManager.getInstance2();
查看这个intent被谁接受,结果在Phone的xml里发现有三个activity都接收,我们需要指定一个
于是对intent做了修改 intent1.setClassName("com.android.phone", "com.android.phone.OutgoingCallBroadcaster");
指定了activity的名字就可以避开选择哪个phone,但是原生的代码是如何解决这个问题的还需要研究