Android 添加按电源键结束通话(2)

在package/app/Phone/res/values/string.xml中添加:

<string>press_power_end_call</string>

在package/app/Phone/res/values-zh-rCN/string.xml中添加:

<string msgid="4676390750360727396">按电源键挂断电话</string>

到这里就算添加好了UI上的东西,接下来就是代码了:

在package/app/Phone/src/com/android/phone下找到CallFeatureSetting.java文件,

在 public boolean onPreferenceChange(Preference preference, Object objValue) 方法中要增加一个如果选择了按power键挂电话

的事件:

//add by xxnan
  else if (preference == press_power_end_call) {
              //如果勾选就将1存到system表的press_power_end_call中
              Settings.System.putInt(getContentResolver(),
                    "press_power_end_call",
                    press_power_end_call.isChecked() ? 1 : 0);
  //end by xxnan     

在OnCreate添加如下代码之后:

protected void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        if (DBG) log("Creating activity");       
        mPhone = PhoneFactory.getDefaultPhone();

addPreferencesFromResource(R.xml.call_feature_setting);
        //add by xxnan
        ContentResolver resolver = getContentResolver();
        press_power_end_call= (CheckBoxPreference)findPreference(press_power_end_call_key);
  press_power_end_call.setOnPreferenceChangeListener(this);
// 获的数据库system表里press_power_end_call的值,也就是是否选择了checkboxpreference
  int  press_power_end_call_key=Settings.System.getInt(getContentResolver(),
                    "press_power_end_call",0);
//如果得到的值是1,则下次打开setting的话,选项框要勾选
  if(press_power_end_call_key==1)
   press_power_end_call.setChecked(true);
  //end by xxnan 
        mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

// get buttons
        PreferenceScreen prefSet = getPreferenceScreen();
        mSubMenuVoicemailSettings = (EditPhoneNumberPreference)findPreference(BUTTON_VOICEMAIL_KEY);
。。。。。。。
。。。。。。。

这样就算差不多完成了到获取是否开启这一功能存放和取出到系统数据库中,接下来就是到framework/base/policy/src/com/android

/internal/policy/impl下的

PhoneWindowManager.java中去处理了,之前我们就有分析到PhoneWindowManager.java中的

public int interceptKeyBeforeQueueing(long whenNanos, int action, int flags, int keyCode, int scanCode, int policyFlags,

boolean isScreenOn)方法来接受按power键的事件,在这个方法里我们只需要添加很少代码:

原来代码是:

case KeyEvent.KEYCODE_POWER: {
                result &= ~ACTION_PASS_TO_USER;   
                if (down) {
        Log.i("xxnan","xxnan"+"xiaxiangnan");
                    ITelephony telephonyService = getTelephonyService(); 
      boolean hungUp = false;                   
                    if (telephonyService != null) {
                        try {
                            if (telephonyService.isRinging()) {
                                // Pressing Power while there's a ringing incoming
                                // call should silence the ringer.
                                telephonyService.silenceRinger();
                            } else if ((mIncallPowerBehavior
                                    & Settings.Secure.INCALL_POWER_BUTTON_BEHAVIOR_HANGUP) != 0
                                    && telephonyService.isOffhook()) {
                                // Otherwise, if "Power button ends call" is enabled,
                                // the Power button will hang up any current active call.
                                hungUp = telephonyService.endCall();
                            }
                       
                        } catch (RemoteException ex) {
                            Log.w(TAG, "ITelephony threw RemoteException", ex);
                        }
                    }
                    interceptPowerKeyDown(!isScreenOn || hungUp);
。。。。。。。。。。。。
。。。。。。。。。。。。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/b6ac8b5aa7a048cfd93bb3f8d4d21701.html