拨号时获取双卡状态及飞行模式判断(设置)

博客内容涉及在拨号时如何获取双卡状态,包括SIM1和SIM2的状态,并进行飞行模式的判断与设置。提供了CallController.java中紧急拨号的代码片段,以及EmergencyCallHelper.java中关于飞行模式判断和退出的实现。

源码在:CallController.java中,以下是截取紧急拨号获取SIM1或SIM2以及另一张卡是否正在拨打电话的判断代码。


  /* below are added by mediatek .inc */
    private CallStatusCode checkIfOkToInitiateOutgoingCall(int state, int slot) {
        log("checkIfOkToInitiateOutgoingCall, state = " + state + " slot = " + slot);
        if(slot == -1)
            return checkIfOkToInitiateOutgoingCall(state);

        GeminiPhone phone = (GeminiPhone) PhoneApp.getInstance().phone;
        if(slot == Phone.GEMINI_SIM_1) {
            if(phone.getStateGemini(Phone.GEMINI_SIM_2) != Phone.State.IDLE)
                return CallStatusCode.CALL_FAILED;
        } else {
            if(phone.getStateGemini(Phone.GEMINI_SIM_1) != Phone.State.IDLE)
                return CallStatusCode.CALL_FAILED;
        }

        final int realState = phone.getServiceStateGemini(slot).getState();
        log("realState = " + realState);
        return checkIfOkToInitiateOutgoingCall(realState);
    }

    int pickBestSlotForEmergencyCall() {
        log("pickBestSlotForEmergencyCall");
        int slot = Phone.GEMINI_SIM_1;

        GeminiPhone phone = (GeminiPhone) PhoneApp.getInstance().phone;
        boolean radioOn0 = phone.isRadioOnGemini(Phone.GEMINI_SIM_1);
        boolean radioOn1 = phone.isRadioOnGemini(Phone.GEMINI_SIM_2);
        log("radioOn0 = " + radioOn0 + " radioOn1 = " + radioOn1);

        if(radioOn0 && radioOn1) {
            // if both radio are power on
            // use the one in service
            if(phone.getStateGemini(Phone.GEMINI_SIM_2) != Phone.State.IDLE)
                slot = Phone.GEMINI_SIM_2;
            else if(phone.getStateGemini(Phone.GEMINI_SIM_1) != Phone.State.IDLE)
                slot = Phone.GEMINI_SIM_1;
            else {
                final int state0 = phone.getServiceStateGemini(Phone.GEMINI_SIM_1).getState();
                final int state1 = phone.getServiceStateGemini(Phone.GEMINI_SIM_2).getState();
                log("service state0 = " + state0 + " state1 = " + state1);

                if(state0 == ServiceState.STATE_OUT_OF_SERVICE && state1 == ServiceState.STATE_IN_SERVICE)
                    slot = Phone.GEMINI_SIM_2;
                if(state1 == ServiceState.STATE_OUT_OF_SERVICE && state0 == ServiceState.STATE_IN_SERVICE)
                    slot = Phone.GEMINI_SIM_1;
            }
        } else if(radioOn0) {
            slot = Phone.GEMINI_SIM_1;
        } else if(radioOn1){
            slot = Phone.GEMINI_SIM_2;
        }

        return slot;
    }


以下为飞行模式判断及退出飞行模式:EmergencyCallHelper.java

 /**
     * Attempt to power on the radio (i.e. take the device out
     * of airplane mode.)
     *
     * Additionally, start listening for service state changes;
     * we'll eventually get an onServiceStateChanged() callback
     * when the radio successfully comes up.
     */
    private void powerOnRadio() {
        if (DBG)
            log("- powerOnRadio()...");

        // We're about to turn on the radio, so arrange to be notified
        // when the sequence is complete.
        registerForServiceStateChanged();

        // If airplane mode is on, we turn it off the same way that the
        // Settings activity turns it off.
        int dualSimMode = 0;
        boolean bOffAirplaneMode = false;
        if (FeatureOption.MTK_GEMINI_SUPPORT)
            dualSimMode = Settings.System.getInt(mApp.getContentResolver(),
                    Settings.System.DUAL_SIM_MODE_SETTING,
                    Settings.System.DUAL_SIM_MODE_SETTING_DEFAULT);

        if (DBG) Log.d(TAG, "dualSimMode = " + dualSimMode);
        if (Settings.System.getInt(mApp.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) > 0) {
            if (DBG) log("==> Turning off airplane mode...");

            // Change the system setting
            Settings.System.putInt(mApp.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0);

            // Post the intent
            Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
            intent.putExtra("state", false);
            mApp.sendBroadcast(intent);
            bOffAirplaneMode = true;
        } else if (!FeatureOption.MTK_GEMINI_SUPPORT) {
            // Otherwise, for some strange reason the radio is off
            // (even though the Settings database doesn't think we're
            // in airplane mode.) In this case just turn the radio
            // back on.
            if (DBG) log("==> (Apparently) not in airplane mode; manually powering radio on...");
            mPhone.setRadioPower(true);
        }
        if (FeatureOption.MTK_GEMINI_SUPPORT
                && (!bOffAirplaneMode || (bOffAirplaneMode && needSetDualSimMode(dualSimMode)))) {
            int mode = getProperDualSimMode();
            Settings.System.putInt(mApp.getContentResolver(),
                    Settings.System.DUAL_SIM_MODE_SETTING, mode);
            final Intent intent = new Intent(Intent.ACTION_DUAL_SIM_MODE_CHANGED);
            intent.putExtra(Intent.EXTRA_DUAL_SIM_MODE, mode);
            mApp.sendBroadcast(intent);
        }
    }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值