有些手机比方泛泰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键振动两次, 只是仅仅是作为支持实体按键振动的话还是能够的:

http://review.cyanogenmod.org/#/c/55274/1/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java

改动的位置为android.policy.jar的源代码里  frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java

  1. diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
  2. index f0719e3..ca38166 100644
  3. --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
  4. +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
  5. @@ -2333,6 +2333,22 @@ public class PhoneWindowManager implements WindowManagerPolicy {
  6. WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
  7. WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
  8. };
  9. +
  10. + private void setKeyVib(WindowState win) {
  11. + WindowManager.LayoutParams attrs;
  12. + Intent service;
  13. + ContentResolver res;
  14. +
  15. + // If a system window has focus, then it doesn't make sense
  16. + // right now to interact with applications.
  17. + attrs = win != null ? win.getAttrs() : null;
  18. + service = new Intent();
  19. + res = mContext.getContentResolver();
  20. + if(1 == Settings.System.getInt(res, Settings.System.HAPTIC_FEEDBACK_ENABLED,0))//when setting feedback enable
  21. + {
  22. + performHapticFeedbackLw(null, HapticFeedbackConstants.KEYBOARD_TAP, true); //启动震动 by syhost
  23. + }
  24. + }
  25.  
  26. /** {@inheritDoc} */
  27. @Override
  28. @@ -2441,7 +2457,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
  29. ViewConfiguration.getDoubleTapTimeout());
  30. return -1;
  31. }
  32. -
  33. +
  34. + setKeyVib(win);
  35. // Go home!
  36. launchHomeFromHotKey();
  37. return -1;
  38. @@ -2514,6 +2531,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
  39. }
  40. if (repeatCount == 0) {
  41. mMenuPressed = true;
  42. + setKeyVib(win);
  43. if (mEnableShiftMenuBugReports && (metaState & chordBug) == chordBug) {
  44. Intent intent = new Intent(Intent.ACTION_BUG_REPORT);
  45. mContext.sendOrderedBroadcast(intent, null);
  46. @@ -2645,9 +2663,13 @@ public class PhoneWindowManager implements WindowManagerPolicy {
  47. }
  48. return -1;
  49. } else if (keyCode == KeyEvent.KEYCODE_BACK) {
  50. + if (down && repeatCount == 0) {
  51. + setKeyVib(win);
  52. + }
  53. if (Settings.Secure.getIntForUser(mContext.getContentResolver(),
  54. Settings.Secure.KILL_APP_LONGPRESS_BACK, 0, UserHandle.USER_CURRENT) == 1) {
  55. if (down && repeatCount == 0) {
  56. + setKeyVib(win);
  57. mHandler.postDelayed(mBackLongPress, mBackKillTimeout);
  58. }
  59. }

相应的smali版本号, 

在本人之前适配的泛泰A820L的cm10版本号的乐蛙ROM里能够找到, 是分几次完毕的:

patch1:

https://github.com/syhost/lewa_patchrom_ef65l/commit/18afafa2c7b770bdb593fee086c7cc07f8789e58

  1. goto :goto_0
  2. .end method
  3.  
  4. +.method private setKeyVib(Landroid/view/WindowManagerPolicy$WindowState;)V
  5. + .locals 7
  6. + .parameter "win"
  7. +
  8. + .prologue
  9. + const/4 v3, 0x0
  10. +
  11. + const/4 v6, 0x1
  12. +
  13. + .line 2110
  14. + if-eqz p1, :cond_1
  15. +
  16. + invoke-interface {p1}, Landroid/view/WindowManagerPolicy$WindowState;->getAttrs()Landroid/view/WindowManager$LayoutParams;
  17. +
  18. + move-result-object v0
  19. +
  20. + .line 2111
  21. + .local v0, attrs:Landroid/view/WindowManager$LayoutParams;
  22. + :goto_0
  23. + new-instance v2, Landroid/content/Intent;
  24. +
  25. + invoke-direct {v2}, Landroid/content/Intent;-><init>()V
  26. +
  27. + .line 2112
  28. + .local v2, service:Landroid/content/Intent;
  29. + iget-object v4, p0, Lcom/android/internal/policy/impl/PhoneWindowManager;->mContext:Landroid/content/Context;
  30. +
  31. + invoke-virtual {v4}, Landroid/content/Context;->getContentResolver()Landroid/content/ContentResolver;
  32. +
  33. + move-result-object v1
  34. +
  35. + .line 2113
  36. + .local v1, res:Landroid/content/ContentResolver;
  37. + const-string v4, "haptic_feedback_enabled"
  38. +
  39. + const/4 v5, 0x0
  40. +
  41. + invoke-static {v1, v4, v5}, Landroid/provider/Settings$System;->getInt(Landroid/content/ContentResolver;Ljava/lang/String;I)I
  42. +
  43. + move-result v4
  44. +
  45. + if-ne v6, v4, :cond_0
  46. +
  47. + .line 2115
  48. + const/4 v4, 0x3
  49. +
  50. + invoke-virtual {p0, v3, v4, v6}, Lcom/android/internal/policy/impl/PhoneWindowManager;->performHapticFeedbackLw(Landroid/view/WindowManagerPolicy$WindowState;IZ)Z
  51. +
  52. + .line 2117
  53. + :cond_0
  54. + return-void
  55. +
  56. + .end local v0 #attrs:Landroid/view/WindowManager$LayoutParams;
  57. + .end local v1 #res:Landroid/content/ContentResolver;
  58. + .end local v2 #service:Landroid/content/Intent;
  59. + :cond_1
  60. + move-object v0, v3
  61. +
  62. + .line 2110
  63. + goto :goto_0
  64. +.end method
  65. +
  66. .method private takeScreenshot()V
  67. .locals 8
  68.  
  69. @@ -8384,6 +8446,7 @@
  70. .line 1799
  71. .end local v11 #ex:Landroid/os/RemoteException;
  72. :cond_6
  73. + invoke-direct/range {p0 .. p1}, Lcom/android/internal/policy/impl/PhoneWindowManager;->setKeyVib(Landroid/view/WindowManagerPolicy$WindowState;)V
  74. invoke-virtual/range {p0 .. p0}, Lcom/android/internal/policy/impl/PhoneWindowManager;->launchHomeFromHotKey()V
  75.  
  76. goto :goto_4
  77. @@ -8631,6 +8694,8 @@
  78.  
  79. if-nez v23, :cond_1c
  80.  
  81. + invoke-direct/range {p0 .. p1}, Lcom/android/internal/policy/impl/PhoneWindowManager;->setKeyVib(Landroid/view/WindowManagerPolicy$WindowState;)V
  82. +
  83. .line 1853
  84. move-object/from16 v0, p0

patch2:

https://github.com/syhost/lewa_patchrom_ef65l/commit/0e5ff497456e9428546be24bae36dfcf4544863f

  1. move/from16 v1, v32
  2.  
  3. - if-ne v0, v1, :cond_1c
  4. + if-ne v0, v1, :cond_34
  5.  
  6. .line 1894
  7. if-eqz v9, :cond_1a
  8. @@ -8887,7 +8887,25 @@
  9. const-wide/16 v32, -0x1
  10.  
  11. goto/16 :goto_1
  12. +
  13. + :cond_34
  14. + const/16 v32, 0x4
  15. +
  16. + move/from16 v0, v18
  17. +
  18. + move/from16 v1, v32
  19. +
  20. + if-ne v0, v1, :cond_1c
  21. +
  22. + if-eqz v9, :cond_1c
  23.  
  24. + if-nez v23, :cond_1c
  25. +
  26. + invoke-direct/range {p0 .. p1}, Lcom/android/internal/policy/impl/PhoneWindowManager;->setKeyVib(Landroid/view/WindowManagerPolicy$WindowState;)V
  27. +
  28. + goto/16 :goto_34
  29. +
  30. +
  31. .line 1897
  32. :cond_19
  33. const/16 v32, 0x1
  34. @@ -8946,6 +8964,7 @@
  35. goto :goto_9
  36.  
  37. .line 1920
  38. + :goto_34
  39. :cond_1c
  40. move-object/from16 v0, p0

上面的patch2主要是加了防止长按home键长振, 相应的java部分是:

  1. + if (down && repeatCount == 0) {
  2. + setKeyVib(win);
  3. + }

Android4.0-4.4 加入实体按键振动支持的方法(java + smali版本号)的更多相关文章

  1. Android4.0+锁屏程序开发——按键屏蔽篇

    开发锁屏程序的时候我们要面临的重要问题无疑是如何屏蔽三个按键,Back,Home,Menu  看似简单的功能,实现起来却并不是那么容易. [屏蔽Back按键] 相对来说,屏蔽Back键是比较简单的,只 ...

  2. Android4.0+锁屏程序开发——设置锁屏页面篇

    [如何开发一个锁屏应用] 想要开发一个锁屏应用,似乎很难,其实并没有想象中那么难. 从本质上来说,锁屏界面也只是一个Activity而已,只是这个界面比较特殊,在我们点亮屏幕的时候,这个界面就会出现. ...

  3. android4.0下如何判断手机是否有底部物理按键(menu物理按键)

    某些手机底部是在触摸屏内部有软按键,就是如(back,home,menu 等)而有的手机底部(非屏幕内部)有物理按键,就是生产厂商不愿意有google自带的虚拟按键,而做的电容式的物理按键,如(bac ...

  4. 深入浅出-Android系统移植与平台开发(一)- Android4.0系统的下载与编译

    作者:唐老师,华清远见嵌入式学院讲师. 一.Android4.0系统的下载与编译 Android系统的下载与编译,Google的官方网站上已经给出了详细的说明,请参照Android的官方网址: htt ...

  5. ubuntu13.04下载android4.0.1源码过程

    最初我参考的是老罗的博客http://blog.csdn.net/luoshengyang/article/details/6559955 进行下载安装的,但弄着弄着就发现不太对劲了.这里记录下详细过 ...

  6. Ubuntu12.04下载Android4.0.1源码全过程,附若干问题解决[转]

    学校里一直在做应用层开发,考虑到日后就业问题,这次决定研究源码和驱动,并进行编译.没想到就下载源码这一步折腾了我整整两天,期间遇到很多问题,哎,记录于此,希望日后再下源码的人不要再走无谓的弯路了.事实 ...

  7. [2013.7.5新鲜出炉] Ubuntu12.04下载Android4.0.1源码全过程----------------折腾两天,终于下好,附若干问题解决

    本文转至 http://blog.csdn.net/yanzi1225627/article/details/9255457 下载源码这一步折腾了我整整两天,期间遇到很多问题,哎,记录于此,希望日后再 ...

  8. 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 ...

  9. 转载: ubuntu13.04下载android4.0.1源码过程

    转自:http://blog.csdn.net/zhanglongit/article/details/9263009,中间有些不行的地方进行了些小修改. 最初我参考的是老罗的博客http://blo ...

随机推荐

  1. C#程序集系列11,全局程序集缓存

    全局程序集缓存(GAC:Global Assembly Cache)用来存放可能被多次使用的强名称程序集.当主程序需要加载程序集的时候,优先选择到全局程序集缓存中去找寻需要的程序集. 为什么需要全局程 ...

  2. MVC实现多选下拉框,保存并显示多选项

    在"MVC实现多选下拉框"中,主要是多选下拉框的显示,而实际情况通常是:选择多个选项提交后,需要在编辑页把所有选中的项显示出来. 模拟这样的一个场景:一个车迷可能有多个自己喜欢的汽 ...

  3. MVC扩展Filter,通过继承HandleErrorAttribute,使用log4net或ELMAH组件记录服务端500错误、HttpException、Ajax异常等

    □ 接口 public interface IExceptionFilter{    void OnException(ExceptionContext filterContext);} Except ...

  4. java内存溢出示例(堆溢出、栈溢出)

    堆溢出: /** * @author LXA * 堆溢出 */ public class Heap { public static void main(String[] args) { ArrayLi ...

  5. 构建一个高可扩展性javabean和jsp连接数据库操作

    1. 我们先在Tomcat 中创建一个DataSource- jdbc/Panabia,然后再创建一个java“基类”,这个类封装了数据库连接和连接的释放. package Panabia.db; i ...

  6. Gedit

    Use Gedit as Remote File Editor via FTP and SSH Migrating from Windows Vista to Ubuntu 8.04 and have ...

  7. 运行时类型识别RTTI

    1.RTTI的工作原理 例1. 用Class加载对象示例. package RTTI; public class Candy { static{ System.out.println("Lo ...

  8. 【Dagger2】 案例大全

    只有Inject是不可以的,必须有Component public class Test { @Inject Person person; private void test() { System.o ...

  9. (转)U3D DrawCall优化手记

    自:http://www.cnblogs.com/ybgame/p/3588795.html 在最近,使用U3D开发的游戏核心部分功能即将完成,中间由于各种历史原因,导致项目存在比较大的问题,这些问题 ...

  10. Visual Studio环境变量使用实例:使用环境变量来组织project

    前言 在前一篇文章Visual Studio中的环境变量(以Visual Studio 2013为例)中介绍了VS中的环境变量,本文将以实际样例说明怎样合理使用这些环境变量来组织VC++project ...