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

原创 2012年09月25日 10:55:18

源码在: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);
        }
    }



android之Radio状态

android 5.1 在Java层,Radio只有三种状态: enum RadioState { RADIO_OFF, /* Radio explic...
  • y658t
  • y658t
  • 2015年11月21日 22:36
  • 2287

Android 5.1以上双卡指定sim卡拨打电话

Android 双卡 指定sim卡 拨打电话
  • zengyan3658229
  • zengyan3658229
  • 2017年02月14日 16:04
  • 1355

Android 双卡双待识别

简介Android双卡双待已经越来越普及了,解决双卡双待管理是广大手机开发人员必须得面对的问题,为实现Android平台的双卡双待管理研究了Android 应用层操作双卡双待的机制。机制 获取基于IT...
  • banketree
  • banketree
  • 2014年04月22日 16:13
  • 20545

Android 飞行模式的设置(打开/关闭飞行模式,获取飞行状态状态)

转自:http://www.pocketdigi.com/20110714/391.html 在Android中设置飞行状态是用BroadCast的,可以通过发送action为”Intent.ACT...
  • yueguanyun
  • yueguanyun
  • 2013年05月31日 16:56
  • 1507

判断是否可以打电话(有无SIM卡、是否飞行模式、信号是否良好)

如题判断是否可以播出电话 1.判断是否有SIM卡 2.判断是否开启飞行模式 3.判断信号是否良好 首先要有TelephonyManager TelephonyManager te...
  • youxi52710
  • youxi52710
  • 2016年03月07日 17:28
  • 629

系统广播监听飞行模式和耳机状态

直接上代码 广播监听飞行模式AirplaneActivitypublic class AirplaneActivity extends Activity { AirplaneReceiver...
  • gangzi14
  • gangzi14
  • 2015年10月13日 16:55
  • 194

android 飞行模式 注册广播后 三种状态监听

public class MainActivity extends Activity implements OnClickListener { private static final String...
  • yixinyouni1314
  • yixinyouni1314
  • 2012年07月26日 18:31
  • 6416

安卓1108_四大组件-BroadCastReceiver广播接收者 ip拨号 短信拦截 开机自启 sd卡状态 APP安装监测 有序 无序广播 帧动画 国际化 style和theme

广播接收者浏览器的书签页面,谷歌配置成了singleTop 谷歌把浏览器的浏览页面配置成singleTask,节省内存 singleInstance来电页面broadcastreceiver ip拨打...
  • yin13753884368
  • yin13753884368
  • 2016年10月12日 20:16
  • 572

MTK双卡SIM信息获取及手机网络状态判断

  • 2014年02月19日 18:36
  • 2.13MB
  • 下载

android开发之快速设置,一键wifi开闭,移动网络开闭,电池设置,飞行模式,………………………………

Android底层对于无论是软件系统还是硬件系统的控制能力都是非常好的,接口定义也十分明确,我们可以很方便的拿来做自己想要的控制,于是近期在项目中就有做个快速设置的功能,要求一键wifi开闭,移动网络...
  • beiminglei
  • beiminglei
  • 2013年04月19日 16:04
  • 2999
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:拨号时获取双卡状态及飞行模式判断(设置)
举报原因:
原因补充:

(最多只允许输入30个字)