• Android给自定义按键添加广播和通过广播给当前焦点输入框赋值


    一、给自定义按键添加广播

    修改PhoneWindowManager.java中的interceptKeyBeforeDispatching方法

    /frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java

     1     @Override
     2     public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) {
     3         final boolean keyguardOn = keyguardOn();
     4         final int keyCode = event.getKeyCode();
     5         final int repeatCount = event.getRepeatCount();
     6         final int metaState = event.getMetaState();
     7         final int flags = event.getFlags();
     8         final boolean down = event.getAction() == KeyEvent.ACTION_DOWN;
     9         final boolean canceled = event.isCanceled();
    10         final boolean longPress = (flags & KeyEvent.FLAG_LONG_PRESS) != 0;
    11         final boolean virtualKey = event.getDeviceId() == KeyCharacterMap.VIRTUAL_KEYBOARD;
    12         final String isCitKeyTest=SystemProperties.get("persist.sys.startCitKeyTest");
    13 
    14 
    15         
    16         //添加自定义按键广播----开始
    17         switch (keyCode)
    18             {
    19                 case 135:
    20                 case 136:
    21                 case 137:
    22                 case 139:
    23                 {
    24                     if (repeatCount == 0) {
    25                         
    26                         Intent myKeyIntent = new Intent();
    27                         
    28                         
    29                         if(down)
    30                         {
    31                             myKeyIntent.setAction("com.rscja.android.KEY_DOWN");
    32                         }
    33                         else
    34                         {
    35                             myKeyIntent.setAction("com.rscja.android.KEY_UP");
    36                         }
    37                         
    38                     
    39                         myKeyIntent.putExtra("keycode", keyCode);
    40                         
    41                         mContext.sendBroadcastAsUser(myKeyIntent, UserHandle.ALL); 
    42                         
    43                         
    44                     
    45                     }
    46                 }
    47                 
    48                 
    49                 
    50                     break;
    51             }
    52             
    53             //添加自定义按键广播----结束
    54 
    55 
    56 
    57 
    58 ……
    59 ……
    60 ……
    61 ……
    62 
    63 }

    二、通过广播给当前焦点输入框赋值

    修改InputMethodService.java中的onCreate()方法

    /frameworks/base/core/java/android/inputmethodservice/InputMethodService.java

     1     @Override public void onCreate() {
     2         mTheme = Resources.selectSystemTheme(mTheme,
     3                 getApplicationInfo().targetSdkVersion,
     4                 android.R.style.Theme_InputMethod,
     5                 android.R.style.Theme_Holo_InputMethod,
     6                 android.R.style.Theme_DeviceDefault_InputMethod,
     7                 android.R.style.Theme_DeviceDefault_InputMethod);
     8         super.setTheme(mTheme);
     9         super.onCreate();
    10         mImm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
    11         mInflater = (LayoutInflater)getSystemService(
    12                 Context.LAYOUT_INFLATER_SERVICE);
    13         mWindow = new SoftInputWindow(this, "InputMethod", mTheme, null, null, mDispatcherState,
    14                 WindowManager.LayoutParams.TYPE_INPUT_METHOD, Gravity.BOTTOM, false);
    15         if (mHardwareAccelerated) {
    16             mWindow.getWindow().addFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
    17         }
    18         initViews();
    19         mWindow.getWindow().setLayout(MATCH_PARENT, WRAP_CONTENT);
    20         
    21         
    22         //注册广播监听
    23         IntentFilter barCodeCheckFilter = new IntentFilter("com.rscja.android.DATA_RESULT");
    24         mRootView.getContext().registerReceiver(m_barCodeCheckReciever,barCodeCheckFilter);
    25         
    26     }
    27     
    28     
    29     //添加自定义广播
    30      private BroadcastReceiver m_barCodeCheckReciever = new  BroadcastReceiver () {
    31 
    32         @Override
    33         public void onReceive(Context context, Intent intent) {
    34         InputConnection conn = getCurrentInputConnection();
    35 
    36         String intent_data=intent.getStringExtra("data");
    37 
    38 
    39         if(intent_data.charAt(intent_data.length() - 1)=='
    ')
    40         {
    41             if (conn != null) {
    42             conn.commitText(intent_data.substring(0,intent_data.length()-1), 1);
    43             }
    44             sendKeyChar('
    ');
    45         }
    46         else
    47         {
    48             if (conn != null) {
    49                 conn.commitText(intent_data, 1);
    50                 }
    51             }
    52         }
    53     };
  • 相关阅读:
    Linux0.11之初识Makefile/build.c
    主机(windows10)虚拟机(ubuntu18)arm板(linux3.4)相互ping通
    windows上利用dhcpsrv搭建DHCP服务器
    《剑指offer》面试题27 二叉搜索树与双向链表 Java版
    《剑指offer》面试题26 复杂链表的复制 Java版
    《剑指offer》面试题25 二叉树中和为某一值的路径 Java版
    《剑指offer》面试题24 二叉搜索树的后序遍历序列 Java版
    异常处理
    三元表达式、列表推导式、生成器表达式、匿名函数、内置函数、递归调用与二分法的简单认识
    迭代器与生成器
  • 原文地址:https://www.cnblogs.com/l2rf/p/5018372.html
Copyright © 2020-2023  润新知