android 添加按(power键)电源键结束通话(挂断电话)

2016-02-19 10:58 57 1 收藏

下面图老师小编要向大家介绍下android 添加按(power键)电源键结束通话(挂断电话),看起来复杂实则是简单的,掌握好技巧就OK,喜欢就赶紧收藏起来吧!

【 tulaoshi.com - 编程语言 】

首先我们发现现在我们所用的android智能手机大部分都有当你在打电话时按power键来挂断电话,一般都是在设置中。
我主要是在原生源码中添加这一功能,主要用于学习。。。。先看一张图:
 
看到那个按电源键挂断电话吧,那就是我所添加的,本来原生源码中是没有这一栏的。。。。。

大概思路
首先我先添加这一个checkboxPreference,然后将是否选择这一功能的值(0和1)存到data/data/com.android.providers.settings
/databases/settings.db数据库的system表中
,然后再根据数据库表中的值在PhoneWindownManager.java中去处理。

具体过程
首先找到setting的源码,在源码下我们要找到通话设置,在seting.xml中我们能找到
代码如下:

SPAN style="FONT-SIZE: 14px" com.android.settings.IconPreferenceScreen
android:key="call_settings"
settings:icon="@drawable/ic_settings_call"
android:title="@string/call_settings_title"
intent
android:action="android.intent.action.MAIN"
android:targetPackage="com.android.phone"
android:targetClass="com.android.phone.CallFeaturesSetting" /
/com.android.settings.IconPreferenceScreen/SPAN

这个call_settings就是我们在setting(设置)中看到的通话设置,但是我们却不能在settings中的源码中找到关于call_settings的布局文件, 因此我们需要找到它,其实这个布局文件是在package/app/Phone中,也就是在Phone这个app源码的资源文件中。

因此我们在Phone的资源文件下能找到Call_feature_setting.xml文件如下:
代码如下:

SPAN style="FONT-SIZE: 14px"PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:phone="http://schemas.android.com/apk/res/com.android.phone"
android:title="@string/call_settings"
PreferenceScreen
android:key="button_fdn_key"
android:title="@string/fdn"
android:summary="@string/sum_fdn"
android:persistent="false"
intent android:action="android.intent.action.MAIN"
android:targetPackage="com.android.phone"
android:targetClass="com.android.phone.FdnSetting" /
/PreferenceScreen
PreferenceCategory
android:key="button_voicemail_category_key"
android:title="@string/voicemail"
android:persistent="false"
ListPreference
android:key="button_voicemail_provider_key"
android:title="@string/voicemail_provider"
android:summary="@string/sum_voicemail_choose_provider"
android:defaultValue=""
android:persistent="true"
/
PreferenceScreen android:key="button_voicemail_setting_key"
android:title="@string/voicemail_settings"
android:persistent="false"
!-- Note for all com.android.phone.EditPhoneNumberPreference objects
The last several attributes are for use with the EditText field
in the dialog. These attributes are forwarded to that field
when the edittext is created. The attributes include:
1. android:singleLine
2. android:autoText
3. android:background --
com.android.phone.EditPhoneNumberPreference
android:key="button_voicemail_key"
android:title="@string/voicemail_settings_number_label"
android:persistent="false"
android:dialogTitle="@string/voicemail"
phone:confirmMode="confirm"
android:singleLine="true"
android:autoText="false" /
/PreferenceScreen
/PreferenceCategory
。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。
/SPAN

因此我们可以在最前面添加一个checkboxPreference
代码如下:

SPAN style="FONT-SIZE: 14px"CheckBoxPreference
android:key="press_power_end_call_key"
android:title="@string/press_power_end_call"
android:persistent="false"//SPAN

变成
代码如下:

SPAN style="FONT-SIZE: 14px"PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:phone="http://schemas.android.com/apk/res/com.android.phone"
android:title="@string/call_settings"
CheckBoxPreference
android:key="press_power_end_call_key"
android:title="@string/press_power_end_call"
android:persistent="false"/
PreferenceScreen
android:key="button_fdn_key"
android:title="@string/fdn"
android:summary="@string/sum_fdn"
android:persistent="false"
intent android:action="android.intent.action.MAIN"
android:targetPackage="com.android.phone"
android:targetClass="com.android.phone.FdnSetting" /
/PreferenceScreen
。。。。。。。
。。。。。。。
。。。。。。。/SPAN

在这里有自己定义的
android:title="@string/press_power_end_call"
所以我们要在资源的string.xml文件中添加相关的信息:
在package/app/Phone/res/values/string.xml中添加:
string name="press_power_end_call"press_power_end_call/string
在package/app/Phone/res/values-zh-rCN/string.xml中添加:
string name="press_power_end_call" msgid="4676390750360727396"按电源键挂断电话/string
到这里就算添加好了UI上的东西,接下来就是代码了:
在package/app/Phone/src/com/android/phone下找到CallFeatureSetting.java文件,
在 public boolean onPreferenceChange(Preference preference, Object objValue) 方法中要增加一个如果选择了按power键挂电话的事件:
代码如下:

SPAN style="FONT-SIZE: 14px"//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 /SPAN

在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);
。。。。。。。。。。。。
。。。。。。。。。。。。

修改后
代码如下:

case KeyEvent.KEYCODE_POWER: {
result &= ~ACTION_PASS_TO_USER;
if (down) {
Log.i("xxnan","xxnan"+"xiaxiangnan");
int end_call_key=Settings.System.getInt(mContext.getContentResolver(),
"press_power_end_call",0); //取出数据库中是否打开这一功能的值
Log.i("end_call_key","end_call_key="+end_call_key);
ITelephony telephonyService = getTelephonyService();
boolean hungUp = false;
if (telephonyService != null) {
try {
//如果是电话正在打且开启了这一功能,当按power键就挂掉电话
if (telephonyService.isRinging()&&end_call_key==1) {
// Pressing Power while there's a ringing incoming
// call should silence the ringer.
// telephonyService.silenceRinger();
hungUp=telephonyService.endCall();
} 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);
。。。。。。。。。。。
。。。。。。。。。。。

由于我这个开发板上是不能插电话卡的也就没能实验成功,但是原理应该就这样的!
最后修改过的地方都要重新编译,那么我们要在源码下编译app下的Phone以及framework下的policy
最后生成的out/。。。/system/app/Phone.apk和out/。。。。/system/framework/android.policy.jar都要替换
手机里的相同(adb shell 进入你的手机,要有root权限)文件应该就可以了。

来源:https://www.tulaoshi.com/n/20160219/1596229.html

延伸阅读
标签: windows系统
如何设置Win8.1 Update电源键   Win8.1用户,你经常使用Win8.1 Update电源按钮吗?这次微软最新的Win8.1 Update为Modern开始屏幕带来电源和搜索按钮。其中,这枚电源按钮也极大方便传统桌面用户的日常使用,例如关机、重启tulaoShi.com或者睡眠。 如果你是一名追求功能齐全的Win8.1用户,希望在Win8.1 Update电源按钮中显示所有...
无需电源键直接让iPhone关机技巧   教你无需电源键直接让iPhone关机的方法:iPhone关机有几种方法,一种是按住设备右上角的电源键,直到屏幕出现滑动来关机;另一种方法是同时按住电源键和 Home 键,这个方法同时还可以用来清一清缓存。         图老师小编推荐:iPhone/iPad电源键坏了怎么开关机 如果...
标签: Android
Android快捷键使用小技巧 作为一款智能操作系统的手机,快捷键的实用是必不可少的,但你确定对所有的功能都有所了解吗,今天笔者就为大家普及一下Atulaoshindroid系统下比较常用的几大使用技巧。 Android快捷键使用小技巧 Android快捷键技巧一、长按Home键:该功能可以帮助用户调出最近实用的6个程序,并将当前程序置入后台...
代码如下: public boolean onKeyDown(int keyCode, KeyEvent event) {          if (event.getAction() == KeyEvent.ACTION_DOWN                  && event.getKeyCode() == KeyEvent.KEYCODE_BACK) {  &nbs...
主要目的是按后退键的时候,让程序能够退出。 实现起来的思路: 1.捕获到后退键事件就触发。 代码如下: @Override  public boolean onKeyDown(int keyCode, KeyEvent event)  {     //按下的如果是BACK,同时没有重复      if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatC...

经验教程

364

收藏

61
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部