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键振动两次, 不过只是作为支持实体按键振动的话还是可以的:

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

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版本)

时间: 2024-08-05 14:59:23

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

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

开发锁屏程序的时候我们要面临的重要问题无疑是如何屏蔽三个按键,Back,Home,Menu  看似简单的功能,实现起来却并不是那么容易. [屏蔽Back按键] 相对来说,屏蔽Back键是比较简单的,只需要在我们的Activity中重写onKeyDown方法,并在其中对Back按键进行拦截即可,代码如下 //屏蔽back @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case

VC6.0打开或者添加工程文件崩溃的解决方法 (转载)

很多学习编程的同学都遇到这样的问题,在Windows操作系统下使用Visual C++ 6.0编程时,如果点击菜单中的[打开]或者[添加],或者按快捷键,都会弹出下图的对话框,出现程序崩溃并退出的情况. 出现这种问题的原因是VC6.0和其他软件冲突所致,网上一般认为是和Office2007或者Office2010冲突,有人说是和Office里的vosio冲突,但是经过检查发现卸载vosio之后问题依旧存在,也有人说是需要重装系统或者重新安装软件,但是这些方法均不可行.         其实这是微

VC6.0打开或者添加工程文件崩溃的解决方法

在Win7操作系统下使用Visual C++ 6.0编程时,如果点击菜单中的[打开]或者[添加],或者按快捷键,都会弹出下图的对话框,出现程序崩溃并退出的情况. 出现这种问题的原因是VC6.0和其他软件冲突所致,网上一般认为是和Office2007或者Office2010冲突,有人说是和Office里的vosio冲突,但是经过检查发现卸载vosio之后问题依旧存在,也有人说是需要重装系统或者重新安装软件,但是这些方法均不可行. 其实这是微软的一个bug,微软官方对于这个问题给出了官方的解决方案(

【转】VC6.0打开或者添加工程文件崩溃的解决方法

很多学习编程的同学都遇到这样的问题,在Windows操作系统下使用Visual C++ 6.0编程时,如果点击菜单中的[打开]或者[添加],或者按快捷键,都会弹出下图的对话框,出现程序崩溃并退出的情况. 出现这种问题的原因是VC6.0和其他软件冲突所致,网上一般认为是和Office2007或者Office2010冲突,有人说是和Office里的vosio冲突,但是经过检查发现卸载vosio之后问题依旧存在,也有人说是需要重装系统或者重新安装软件,但是这些方法均不可行. 其实这是微软的一个bug,

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

[如何开发一个锁屏应用] 想要开发一个锁屏应用,似乎很难,其实并没有想象中那么难. 从本质上来说,锁屏界面也只是一个Activity而已,只是这个界面比较特殊,在我们点亮屏幕的时候,这个界面就会出现. 而且在此界面中,我们可以用一些行为来退出,比如点击按钮等. 还有一个特征是在这个界面的时候,我们通常是不能使用底部的三个按钮的 关于如果屏蔽底部的三个按钮,我已经在另一篇博客Android4.0+锁屏程序开发——按键屏蔽篇进行了总结,有需要的朋友可以参看. 这篇博客我们主要讨论如何让一个Activ

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

某些手机底部是在触摸屏内部有软按键,就是如(back,home,menu 等)而有的手机底部(非屏幕内部)有物理按键,就是生产厂商不愿意有google自带的虚拟按键,而做的电容式的物理按键,如(back,home,menu 等)android4.0下可以用此判断是否有物理按键:ViewConfiguration.get(this).hasPermanentMenuKey(); android4.0下如何判断手机是否有底部物理按键(menu物理按键),布布扣,bubuko.com

关于解决android4.0系统中菜单无法添加Icon的问题

在Android4.0系统中,创建菜单Menu,然后通过setIcon方法给菜单添加图标是无效的,图标不会显出来,而之前的系统中是可以显示出来的.这个问题的根本原因在于4.0系统中,涉及到菜单的源码类 MenuBuilder做了改变,其中有private boolean mOptionalIconsVisible = false;属性使得无法显示菜单图标. 但是,我们又无法在开发的应用程序中创建MenuBuilder这个对象的(因为MenuBuilder是系统内部的框架类). 当然如果不是很需要

Android4.0.4-在build.prop中添加属性的方法【转】

本文转载自:http://blog.csdn.net/imyfriend/article/details/8939964 1.在*.rc文件中用setprop添加,例如在源码android4.0\system\core\rootdir\etc\init.goldfish.rc中有以下内容: setprop ARGH ARGH    setprop net.eth0.gw 10.0.2.2    setprop net.eth0.dns1 10.0.2.3    setprop net.gprs.

解决android4.0系统中菜单(Menu)添加Icon无效问题

在Android4.0系统中,创建菜单Menu,通过setIcon方法给菜单添加图标是无效的,图标没有显出来,2.3系统中是可以显示出来的.这个问题的根本原因在于4.0系统中,涉及到菜单的源码类 MenuBuilder做了改变,该类的部分源码如下: 1 public class MenuBuilder implements Menu { 2 ... 3 private boolean mOptionalIconsVisible = false; 4 .... 5 void setOptional