Android4.0-4.4 加入实体按键振动支持的方法(java + smali版本号)
有些手机比方泛泰A820L, 泛泰A890 A900 以及Nubia Z5S 和Z5S mini具有实体按键(这里所说的实体按键是相对于虚拟按键而言, 包括物理按键和触摸屏上多出来的触摸实体按键), 当编译第三方ROM比方CM或者Mokee或者Omni时就会发现假设不做改动的话默认触摸实体按键时是没有振动支持的, 甚至有些patchrom的MIUI或者ColorOS等系统也可能不支持. 不知道是CM代码的问题还是编译的Config没写全然造成的,
后来经过本人改动后是能够支持按键振动, 只是仅仅能作为暂时解决方式參考.
转帖请注明出处和网址来源:
http://blog.csdn.net/syhost/article/details/32067695
java版本号代码
在本人提交的cm的review上, 没有被通过,由于假设加进来不改动的话,会影响虚拟键的振动,会导致home键振动两次, 只是仅仅是作为支持实体按键振动的话还是能够的:
改动的位置为android.policy.jar的源代码里 frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index f0719e3..ca38166 100644
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -2333,6 +2333,22 @@ public class PhoneWindowManager implements WindowManagerPolicy {
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
};
+
+ private void setKeyVib(WindowState win) {
+ WindowManager.LayoutParams attrs;
+ Intent service;
+ ContentResolver res;
+
+ // If a system window has focus, then it doesn't make sense
+ // right now to interact with applications.
+ attrs = win != null ? win.getAttrs() : null;
+ service = new Intent();
+ res = mContext.getContentResolver();
+ if(1 == Settings.System.getInt(res, Settings.System.HAPTIC_FEEDBACK_ENABLED,0))//when setting feedback enable
+ {
+ performHapticFeedbackLw(null, HapticFeedbackConstants.KEYBOARD_TAP, true); //启动震动 by syhost
+ }
+ } /** {@inheritDoc} */
@Override
@@ -2441,7 +2457,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
ViewConfiguration.getDoubleTapTimeout());
return -1;
}
-
+
+ setKeyVib(win);
// Go home!
launchHomeFromHotKey();
return -1;
@@ -2514,6 +2531,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
if (repeatCount == 0) {
mMenuPressed = true;
+ setKeyVib(win);
if (mEnableShiftMenuBugReports && (metaState & chordBug) == chordBug) {
Intent intent = new Intent(Intent.ACTION_BUG_REPORT);
mContext.sendOrderedBroadcast(intent, null);
@@ -2645,9 +2663,13 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
return -1;
} else if (keyCode == KeyEvent.KEYCODE_BACK) {
+ if (down && repeatCount == 0) {
+ setKeyVib(win);
+ }
if (Settings.Secure.getIntForUser(mContext.getContentResolver(),
Settings.Secure.KILL_APP_LONGPRESS_BACK, 0, UserHandle.USER_CURRENT) == 1) {
if (down && repeatCount == 0) {
+ setKeyVib(win);
mHandler.postDelayed(mBackLongPress, mBackKillTimeout);
}
}
相应的smali版本号,
在本人之前适配的泛泰A820L的cm10版本号的乐蛙ROM里能够找到, 是分几次完毕的:
patch1:
https://github.com/syhost/lewa_patchrom_ef65l/commit/18afafa2c7b770bdb593fee086c7cc07f8789e58
goto :goto_0
.end method +.method private setKeyVib(Landroid/view/WindowManagerPolicy$WindowState;)V
+ .locals 7
+ .parameter "win"
+
+ .prologue
+ const/4 v3, 0x0
+
+ const/4 v6, 0x1
+
+ .line 2110
+ if-eqz p1, :cond_1
+
+ invoke-interface {p1}, Landroid/view/WindowManagerPolicy$WindowState;->getAttrs()Landroid/view/WindowManager$LayoutParams;
+
+ move-result-object v0
+
+ .line 2111
+ .local v0, attrs:Landroid/view/WindowManager$LayoutParams;
+ :goto_0
+ new-instance v2, Landroid/content/Intent;
+
+ invoke-direct {v2}, Landroid/content/Intent;-><init>()V
+
+ .line 2112
+ .local v2, service:Landroid/content/Intent;
+ iget-object v4, p0, Lcom/android/internal/policy/impl/PhoneWindowManager;->mContext:Landroid/content/Context;
+
+ invoke-virtual {v4}, Landroid/content/Context;->getContentResolver()Landroid/content/ContentResolver;
+
+ move-result-object v1
+
+ .line 2113
+ .local v1, res:Landroid/content/ContentResolver;
+ const-string v4, "haptic_feedback_enabled"
+
+ const/4 v5, 0x0
+
+ invoke-static {v1, v4, v5}, Landroid/provider/Settings$System;->getInt(Landroid/content/ContentResolver;Ljava/lang/String;I)I
+
+ move-result v4
+
+ if-ne v6, v4, :cond_0
+
+ .line 2115
+ const/4 v4, 0x3
+
+ invoke-virtual {p0, v3, v4, v6}, Lcom/android/internal/policy/impl/PhoneWindowManager;->performHapticFeedbackLw(Landroid/view/WindowManagerPolicy$WindowState;IZ)Z
+
+ .line 2117
+ :cond_0
+ return-void
+
+ .end local v0 #attrs:Landroid/view/WindowManager$LayoutParams;
+ .end local v1 #res:Landroid/content/ContentResolver;
+ .end local v2 #service:Landroid/content/Intent;
+ :cond_1
+ move-object v0, v3
+
+ .line 2110
+ goto :goto_0
+.end method
+
.method private takeScreenshot()V
.locals 8 @@ -8384,6 +8446,7 @@
.line 1799
.end local v11 #ex:Landroid/os/RemoteException;
:cond_6
+ invoke-direct/range {p0 .. p1}, Lcom/android/internal/policy/impl/PhoneWindowManager;->setKeyVib(Landroid/view/WindowManagerPolicy$WindowState;)V
invoke-virtual/range {p0 .. p0}, Lcom/android/internal/policy/impl/PhoneWindowManager;->launchHomeFromHotKey()V goto :goto_4
@@ -8631,6 +8694,8 @@ if-nez v23, :cond_1c + invoke-direct/range {p0 .. p1}, Lcom/android/internal/policy/impl/PhoneWindowManager;->setKeyVib(Landroid/view/WindowManagerPolicy$WindowState;)V
+
.line 1853
move-object/from16 v0, p0
patch2:
https://github.com/syhost/lewa_patchrom_ef65l/commit/0e5ff497456e9428546be24bae36dfcf4544863f
move/from16 v1, v32 - if-ne v0, v1, :cond_1c
+ if-ne v0, v1, :cond_34 .line 1894
if-eqz v9, :cond_1a
@@ -8887,7 +8887,25 @@
const-wide/16 v32, -0x1 goto/16 :goto_1
+
+ :cond_34
+ const/16 v32, 0x4
+
+ move/from16 v0, v18
+
+ move/from16 v1, v32
+
+ if-ne v0, v1, :cond_1c
+
+ if-eqz v9, :cond_1c + if-nez v23, :cond_1c
+
+ invoke-direct/range {p0 .. p1}, Lcom/android/internal/policy/impl/PhoneWindowManager;->setKeyVib(Landroid/view/WindowManagerPolicy$WindowState;)V
+
+ goto/16 :goto_34
+
+
.line 1897
:cond_19
const/16 v32, 0x1
@@ -8946,6 +8964,7 @@
goto :goto_9 .line 1920
+ :goto_34
:cond_1c
move-object/from16 v0, p0
上面的patch2主要是加了防止长按home键长振, 相应的java部分是:
+ if (down && repeatCount == 0) {
+ setKeyVib(win);
+ }
Android4.0-4.4 加入实体按键振动支持的方法(java + smali版本号)的更多相关文章
- Android4.0+锁屏程序开发——按键屏蔽篇
开发锁屏程序的时候我们要面临的重要问题无疑是如何屏蔽三个按键,Back,Home,Menu 看似简单的功能,实现起来却并不是那么容易. [屏蔽Back按键] 相对来说,屏蔽Back键是比较简单的,只 ...
- Android4.0+锁屏程序开发——设置锁屏页面篇
[如何开发一个锁屏应用] 想要开发一个锁屏应用,似乎很难,其实并没有想象中那么难. 从本质上来说,锁屏界面也只是一个Activity而已,只是这个界面比较特殊,在我们点亮屏幕的时候,这个界面就会出现. ...
- android4.0下如何判断手机是否有底部物理按键(menu物理按键)
某些手机底部是在触摸屏内部有软按键,就是如(back,home,menu 等)而有的手机底部(非屏幕内部)有物理按键,就是生产厂商不愿意有google自带的虚拟按键,而做的电容式的物理按键,如(bac ...
- 深入浅出-Android系统移植与平台开发(一)- Android4.0系统的下载与编译
作者:唐老师,华清远见嵌入式学院讲师. 一.Android4.0系统的下载与编译 Android系统的下载与编译,Google的官方网站上已经给出了详细的说明,请参照Android的官方网址: htt ...
- ubuntu13.04下载android4.0.1源码过程
最初我参考的是老罗的博客http://blog.csdn.net/luoshengyang/article/details/6559955 进行下载安装的,但弄着弄着就发现不太对劲了.这里记录下详细过 ...
- Ubuntu12.04下载Android4.0.1源码全过程,附若干问题解决[转]
学校里一直在做应用层开发,考虑到日后就业问题,这次决定研究源码和驱动,并进行编译.没想到就下载源码这一步折腾了我整整两天,期间遇到很多问题,哎,记录于此,希望日后再下源码的人不要再走无谓的弯路了.事实 ...
- [2013.7.5新鲜出炉] Ubuntu12.04下载Android4.0.1源码全过程----------------折腾两天,终于下好,附若干问题解决
本文转至 http://blog.csdn.net/yanzi1225627/article/details/9255457 下载源码这一步折腾了我整整两天,期间遇到很多问题,哎,记录于此,希望日后再 ...
- android4.0 4.1 4.2 4.3 4.4新特性
http://blog.csdn.net/kaiyang45/article/details/7179349 4.0 http://digi.tech.qq.com/a/20120628/000827 ...
- 转载: ubuntu13.04下载android4.0.1源码过程
转自:http://blog.csdn.net/zhanglongit/article/details/9263009,中间有些不行的地方进行了些小修改. 最初我参考的是老罗的博客http://blo ...
随机推荐
- PHP自学之路---雇员管理系统(1)
前面已经介绍了Zend studio工具的使用以及软件开发的基本阶段,下面就是我们第一个练习,雇员管理系统,从设计到实现来简单介绍下: 开发环境: 服务器:基于Linux 2.618环境下配置PHP服 ...
- HTML中显示的文字自动换行
在html中控制自动换行 http://www.cnblogs.com/zjxbetter/articles/1323449.html eg: <table> <tr> < ...
- winform打开进程与关闭进程
#region 判断某进程名是否运行 /// <summary> /// 关闭指定名称的进程 /// </summary> /// <param name="p ...
- [Asp.net web api]缓存
摘要 为了提高接口的性能,我们常做的优化就包括缓存,对经常访问但变化不大的数据进行缓存.或者使用http的缓存,减少请求的次数. web api缓存 在提供的api,我们也可以实现缓存,来减少访问的次 ...
- js单例模式详解实例
这篇文章主要介绍了什么是单例单例模式.使用场景,提供了3个示例给大家参考 什么是单例? 单例要求一个类有且只有一个实例,提供一个全局的访问点.因此它要绕过常规的控制器,使其只能有一个实例,供使用者使用 ...
- MVC批量更新,可验证并解决集合元素不连续控制器接收不完全的问题
在"MVC批量添加,增加一条记录的同时添加N条集合属性所对应的个体"中,有2个问题待解决: 1.由jquery动态生成了表单元素,但不能实施验证. 2.一旦集合元素不连续,控制器就 ...
- linux-修改时区时间
所有笔记基于-CentOS release 6.8 (Final) ntpdate 202.120.2.101 同步上海时间 cp -f /usr/share/zoneinfo/Asia/Shangh ...
- 在Ubuntu 12.04 桌面上设置启动器(快捷方式)
在Ubuntu 12.04 桌面上设置启动器(快捷方式)过程讲解: 如下图所示,Eclipse 和 SQLDeveloper 都可以直接双击打开,这些应用程序的启动器都在 /usr/share/app ...
- 使用标准模板find函数来对结构体容器进行查找
最近在写一个项目,项目中需要获得类下面的所有对象,所以我采用了map容器,以string为关键字,list容器为内容来进行查找,而list中是一些struct结构体.由于在插入操作的时候需要判断该对象 ...
- Informatica 常用组件Filter之一 概述
转换类型:已连接.主动 过滤器转换允许您过滤映射中的行.通过过滤器转换从源转换传递所有的行,然后为转换输入过滤条件.所有过滤器转换中的端口均为输入/输出端口,只有符合条件的行才能通过过滤器转换. 在某 ...