现在的位置: 首页 > 综合 > 正文

自定义外部按键实现android对按键事件的响应实现流程

2018年08月24日 ⁄ 综合 ⁄ 共 6207字 ⁄ 字号 评论关闭

自定义外部按键(硬件),实现android对按键事件的响应实现流程:

1、内核层:

将按键驱动做好,并参考include/linux/input.h

#define KEY_F20                         190

#define KEY_F21                         191

#define KEY_F22                         192

#define KEY_F23                         193

#define KEY_F24                         194

 

修改 arch/arm/mach-s3c64xx/mach-mini6410.c

static struct gpio_keys_button gpio_buttons[] = {

……………

  {

            .gpio            = S3C64XX_GPL(12),

            .code            = 190,

            .desc            = " FUNCTION_F1",

            .active_low   = 1,

            .wakeup                 = 0,

  }, {

            .gpio            = S3C64XX_GPN(3),

            .code            = 191,

            .desc            = " FUNCTION_F2",

            .active_low   = 1,

            .wakeup                 = 0,

  }, {

           .gpio            = S3C64XX_GPN(4),

            .code            = 192,

            .desc            = " FUNCTION_F3",

            .active_low   = 1,

            .wakeup                 = 0,

  }, {

            .gpio            = S3C64XX_GPN(5),

            .code            = 193,

            .desc            = " FUNCTION_F4",

            .active_low   = 1,

            .wakeup                 = 0,

  }, {

            .gpio            = S3C64XX_GPN(2),

            .code           = 194,

            .desc            = " FUNCTION_F5",

            .active_low   = 1,

            .wakeup                 = 0,

  }

};

 

2android文件系统层

   1)、/frameworks/base/include/ui/keycodeLabels.h

           在数组static const KeycodeLabel KEYCODES[]
中添加新定义的信息

    { "FUNCTION_F1", 111 },

   
{ "FUNCTION_F2", 112 },

   
{ "FUNCTION_F3", 113 },

   
{ "FUNCTION_F4", 114 },

   
{ "FUNCTION_F5", 115 },

      2)、 ./ frameworks/base/native/include/android/Keycodes.h
枚举类型中添加

    
AKEYCODE_FUNCTION_F1     = 111,

   
AKEYCODE_FUNCTION_F2     = 112,

   
AKEYCODE_FUNCTION_F3     = 113,

   
AKEYCODE_FUNCTION_F4     = 114,

   
AKEYCODE_FUNCTION_F5     = 115,

 

       3)、 ./frameworks/base/core/res/res/values/attrs.xml

  <enum name="KEYCODE_FUNCTION_F1" value="111" />

 
<enum name="KEYCODE_FUNCTION_F2" value="112" />

 
<enum name="KEYCODE_FUNCTION_F3" value="113" />

 
<enum name="KEYCODE_FUNCTION_F4" value="114" />

 
<enum name="KEYCODE_FUNCTION_F5" value="115" />

      4)、  ./frameworks/base/core/java/android/view/KeyEvent.java

   
public static final int KEYCODE_FUNCTION_F1     = 111;

   
public static final int KEYCODE_FUNCTION_F2     = 112;

   
public static final int KEYCODE_FUNCTION_F3     = 113;

   
public static final int KEYCODE_FUNCTION_F4     = 114;

   
public static final int KEYCODE_FUNCTION_F5     = 115;

  
并修改

 private static final int LAST_KEYCODE           =  KEYCODE_FUNCTION_F5;

      5)、  ./frameworks/base/libs/ui/Input.java

    bool KeyEvent::isSystemKey(int32_t keyCode)()中,同样需要添加:

case AKEYCODE_FUNCTION_F1:

 
case AKEYCODE_FUNCTION_F2:

 
case AKEYCODE_FUNCTION_F3:

 
case AKEYCODE_FUNCTION_F4:

 
case AKEYCODE_FUNCTION_F5:

 

6)、通过以上的更改,新的键值就添加上去了,注意上面标红色的数字表示必须相同的,另外由于更改了 KeyEvent,影响到了API,所以需要make
update-api

 

7)、修改system/usr/keylayout/qwerty.kl文件

key 194   FUNCTION_F5        WAKE_DROPPED

key 193   FUNCTION_F4        WAKE_DROPPED

key 192   FUNCTION_F3        WAKE_DROPPED

key 190   FUNCTION_F1        WAKE_DROPPED

key 191   FUNCTION_F2        WAKE_DROPPED

 

7)、应用程序以两种方式响应:

    a: 应用程序的View或者Activity通过调用onKeyDown()onKeyUp()直接监听按键消息。

public boolean onKeyDown(int kCode,KeyEvent kEvent)

{

    switch(kCode)

    {

    case KeyEvent. FUNCTION_F1:

         Log.v("MyKeyDown","onkeydown= FUNCTION_F1");

          break;

            …………..

}

}

 

   b:在系统中对新键值做特殊处理

    如果对新键值进行处理,可以通过获取相应的keycode,对它进行处理;对于按键事件的处理一般如下文件中:./frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java

的函数

    public boolean interceptKeyBeforeDispatching(WindowState win, int action, int flags,

            int keyCode, int metaState, int repeatCount, int policyFlags) {

……………………………….

// added by joqian 20121026 start

 

         if ((keyCode == KeyEvent.KEYCODE_FUNCTION_F1) && !down)

         {

          String actionString = "com.axent.succi.controller.keycode_function1";

             Intent intent = new Intent(actionString);

             mContext.sendBroadcast(intent);

            Log.i(TAG, "interceptKeyBeforeDispatching function KEYCODE_FUNCTION_F1 by joqian\n");

         }

         if ((keyCode == KeyEvent.KEYCODE_FUNCTION_F2) && !down)

         {

          String actionString = "com.axent.succi.controller.keycode_function2";

             Intent intent = new Intent(actionString);

             mContext.sendBroadcast(intent);

            Log.i(TAG, "interceptKeyBeforeDispatching function KEYCODE_FUNCTION_F2 by joqian\n");

         }

         if ((keyCode == KeyEvent.KEYCODE_FUNCTION_F3) && !down)

         {

          String actionString = "com.axent.succi.controller.keycode_function3";

             Intent intent = new Intent(actionString);

             mContext.sendBroadcast(intent);

             Log.i(TAG, "interceptKeyBeforeDispatching function KEYCODE_FUNCTION_F3 by joqian\n");

         }

         if ((keyCode == KeyEvent.KEYCODE_FUNCTION_F4) && !down)

         {

          String actionString = "com.axent.succi.controller.keycode_function4";

             Intent intent = new Intent(actionString);

             mContext.sendBroadcast(intent);

            Log.i(TAG, "interceptKeyBeforeDispatching function KEYCODE_FUNCTION_F4 by joqian\n");

         }    

         // added by joqian 20121026 end

…………………………………

}

 

 

3、应用程序层:

1)、首先建立一个应用程序,并且建立一个类

package com.axent;

 

 

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.util.Log;

 

 

public class myBroadCast extends BroadcastReceiver

{

public myBroadCast()

{

         Log.v("myBroadCast","myBroadCast");

}

 

@Override

public void onReceive(Context context, Intent intent)

{

Log.v("myBroadCast", "onReceive");

 

}

}

 

2)、并且修改AndroidManifest.xml,添加红色代码部分:

<application android:label="@string/app_name"

        android:icon="@drawable/ic_launcher"

        android:theme="@style/AppTheme">

 

        
<receiver android:name=".myBroadCast"> 

                 <intent-filter> 

<action android:name="com.axent.succi.controller.keycode_function1"/>

                           <action android:name="com.axent.succi.controller.keycode_function2"/>

                           <action android:name="com.axent.succi.controller.keycode_function3"/> 

                           <action android:name="com.axent.succi.controller.keycode_function4"/> 

                 </intent-filter> 

        
</receiver>

       

    </application>

 

 

 

 

 

 

参考:

Linux驱动和android文件系统的修改方法参考:http://blog.csdn.net/acm2008/article/details/7065546

http://blog.csdn.net/acm2008/article/details/7065546

 

应用程序的编写方法参考:http://www.cnblogs.com/TerryBlog/archive/2010/08/16/1801016.html

抱歉!评论已关闭.