前几天接到个任务,让android原生的输入法支持物理按键,同时在状态栏体现。

一开始直接在拉丁输入法LatinIME.java类中处理,然后客户要求不能在输入法中处理,于是对InputMethodService.java进行处理。

 /*begin add by csc*/private long timeDown,timeUp;private int count,typeCount ;private String input;private int lastKeyCode;private boolean isLongPressed = false;private boolean isDown = false;private static final long DELAY_TIME = 700;private boolean isInput = true;InputConnection inputConnection;// add by csc/*end add by csc*/
public boolean onKeyDown(int keyCode, KeyEvent event) {/*begin add by csc*/if(Settings.Global.getInt(getApplicationContext().getContentResolver(), "aa_key_switch_case_function_enabled",0)==1) {final EditorInfo ei = getCurrentInputEditorInfo();if (ei.inputType != 524289 && ei.inputType != InputType.TYPE_NULL && ei.inputType != InputType.TYPE_CLASS_NUMBER && ei.inputType != InputType.TYPE_NUMBER_FLAG_SIGNED && ei.inputType != InputType.TYPE_NUMBER_FLAG_DECIMAL && ei.inputType != InputType.TYPE_CLASS_PHONE) {if (isInput && keyCode >= KeyEvent.KEYCODE_0 && keyCode <= KeyEvent.KEYCODE_9 || keyCode == KeyEvent.KEYCODE_STAR || keyCode == KeyEvent.KEYCODE_F3 || keyCode == KeyEvent.KEYCODE_POUND) {handler.removeCallbacks(runnableUp);if (typeCount != 0) {if (!isLongPressed) {timeDown = System.currentTimeMillis();if (/*keyCode == KeyEvent.KEYCODE_F3||*/lastKeyCode != 0 && lastKeyCode != keyCode && timeDown - timeUp < DELAY_TIME && lastKeyCode != KeyEvent.KEYCODE_0 && !isDown) {if (typeCount == 2) {input = input.toUpperCase();}if (DEBUG)Log.d("chenshichun", " " + this.getClass().getCanonicalName() + " :::::input::::" + input);inputConnection.commitText(input, 1);count = 0;}if (!isDown && keyCode != KeyEvent.KEYCODE_F3)handler.postDelayed(runnableDown, DELAY_TIME);isDown = true;switch (keyCode) {case KeyEvent.KEYCODE_0:input = "0";return true;case KeyEvent.KEYCODE_1:input = "1";return true;case KeyEvent.KEYCODE_2:input = "2";return true;case KeyEvent.KEYCODE_3:input = "3";return true;case KeyEvent.KEYCODE_4:input = "4";return true;case KeyEvent.KEYCODE_5:input = "5";return true;case KeyEvent.KEYCODE_6:input = "6";return true;case KeyEvent.KEYCODE_7:input = "7";return true;case KeyEvent.KEYCODE_8:input = "8";return true;case KeyEvent.KEYCODE_9:input = "9";return true;case KeyEvent.KEYCODE_STAR:input = "*";return true;case KeyEvent.KEYCODE_POUND:input = "#";return true;}} else {return true;}}if (keyCode == KeyEvent.KEYCODE_F3) {return true;}}}}/*end add by csc*/if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {if (handleBack(false)) {event.startTracking();return true;}return false;}return doMovementKey(keyCode, event, MOVEMENT_DOWN);}
 public boolean onKeyUp(int keyCode, KeyEvent event) {/*begin add by csc*/if(Settings.Global.getInt(getApplicationContext().getContentResolver(), "aa_key_switch_case_function_enabled",0)==1) {final EditorInfo ei = getCurrentInputEditorInfo();if (ei.inputType != 524289 && ei.inputType != InputType.TYPE_NULL && ei.inputType != InputType.TYPE_CLASS_NUMBER && ei.inputType != InputType.TYPE_NUMBER_FLAG_SIGNED && ei.inputType != InputType.TYPE_NUMBER_FLAG_DECIMAL && ei.inputType != InputType.TYPE_CLASS_PHONE) {if (isInput) {isDown = false;if (typeCount != 0 && /*keyCode != KeyEvent.KEYCODE_POUND && */keyCode != KeyEvent.KEYCODE_F3 &&(keyCode >= KeyEvent.KEYCODE_0 && keyCode <= KeyEvent.KEYCODE_9 || keyCode == KeyEvent.KEYCODE_STAR || keyCode == KeyEvent.KEYCODE_POUND)) {long nowTime = System.currentTimeMillis();inputConnection = getCurrentInputConnection();if (isLongPressed) {isLongPressed = false;} else {handler.removeCallbacks(runnableDown);switch (keyCode) {case KeyEvent.KEYCODE_0:if (nowTime - timeDown < DELAY_TIME) {handler.removeCallbacks(runnableDown);input = " ";inputConnection.commitText(input, 1);}break;case KeyEvent.KEYCODE_1:switch (count % 3) {case 0:input = ",";break;case 1:input = ".";break;case 2:input = "@";break;}break;case KeyEvent.KEYCODE_2:switch (count % 3) {case 0:input = "a";break;case 1:input = "b";break;case 2:input = "c";break;}break;case KeyEvent.KEYCODE_3:switch (count % 3) {case 0:input = "d";break;case 1:input = "e";break;case 2:input = "f";break;}break;case KeyEvent.KEYCODE_4:switch (count % 3) {case 0:input = "g";break;case 1:input = "h";break;case 2:input = "i";break;}break;case KeyEvent.KEYCODE_5:switch (count % 3) {case 0:input = "j";break;case 1:input = "k";break;case 2:input = "l";break;}break;case KeyEvent.KEYCODE_6:switch (count % 3) {case 0:input = "m";break;case 1:input = "n";break;case 2:input = "o";break;}break;case KeyEvent.KEYCODE_7:switch (count % 4) {case 0:input = "p";break;case 1:input = "q";break;case 2:input = "r";break;case 3:input = "s";break;}break;case KeyEvent.KEYCODE_8:switch (count % 3) {case 0:input = "t";break;case 1:input = "u";break;case 2:input = "v";break;}break;case KeyEvent.KEYCODE_9:switch (count % 4) {case 0:input = "w";break;case 1:input = "x";break;case 2:input = "y";break;case 3:input = "z";break;}break;case KeyEvent.KEYCODE_STAR:switch (count % 2) {case 0:input = ".";break;case 1:input = ",";break;}break;case KeyEvent.KEYCODE_POUND:input = "#";break;}if (typeCount == 2) {input = input.toUpperCase();}inputConnection.setComposingText(input, 1);handler.removeCallbacks(runnableUp);handler.postDelayed(runnableUp, DELAY_TIME);count++;isLongPressed = false;timeUp = System.currentTimeMillis();lastKeyCode = keyCode;}}if (keyCode == KeyEvent.KEYCODE_F3) {switch (typeCount) {case 0:typeCount = 1;break;case 1:typeCount = 2;break;case 2:typeCount = 0;break;}input = "";Intent intent = new Intent("INPUT_STATUS_CHANGE");intent.putExtra("INPUT_STATUS", typeCount);sendBroadcast(intent);}}}}/*end add by csc*/if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.isTracking()&& !event.isCanceled()) {return handleBack(true);}return doMovementKey(keyCode, event, MOVEMENT_UP);}
/*begin add by csc*/Handler handler = new Handler();Runnable runnableDown = new Runnable() {@Overridepublic void run() {try {inputConnection.commitText(input, 1);if(DEBUG)Log.d("chenshichun"," "+this.getClass().getCanonicalName()+" :::::runnableDown::::"+input);isLongPressed = true;} catch (Exception e) {e.printStackTrace();System.out.println("exception...");}}};Runnable runnableUp = new Runnable() {@Overridepublic void run() {try {if(typeCount==2){input = input.toUpperCase();}inputConnection.commitText(input, 1);if(DEBUG)Log.d("chenshichun"," "+this.getClass().getCanonicalName()+" :::::runnableUp::::"+input);count = 0;} catch (Exception e) {e.printStackTrace();System.out.println("exception...");}}};/*end add by csc*/

因为监听不到长按事件,所以在每次down的时候都当长按处理,handler.postDelayed(runnableDown, DELAY_TIME); 每次up的时候先handler.removeCallbacks(runnableDown);这时候如果抬手时间大于DELAY_TIME就会当长按处理,在电话,计算器等只需要输入数字的界面就将该功能屏蔽,通过输入类型来判断即可,这里524289是计算器读出来的类型,源码中找不到就直接写数值了。

ei.inputType != 524289 && ei.inputType != InputType.TYPE_NULL && ei.inputType != InputType.TYPE_CLASS_NUMBER && ei.inputType != InputType.TYPE_NUMBER_FLAG_SIGNED && ei.inputType != InputType.TYPE_NUMBER_FLAG_DECIMAL && ei.inputType != InputType.TYPE_CLASS_PHONE

当切换大小写的时候在PhoneStatusBar.java接受广播

else if("INPUT_STATUS_CHANGE".equals(action)){// add by cscint inputStatus = intent.getIntExtra("INPUT_STATUS",0);switch (inputStatus){case 0:mInputStatus.setText("");break;case 1:mInputStatus.setText(R.string.input_lower);break;case 2:mInputStatus.setText(R.string.input_case);break;}}else if ("INPUT_ON_OR_FALSE".equals(action)){// add by cscboolean putStatusOn = intent.getBooleanExtra("INPUT_STATUS_ON",false);mInputStatus.setVisibility(putStatusOn?View.VISIBLE:View.GONE);}

其中INPUT_ON_OR_FALSE这个广播是设置里面发出的,设置里面加了一个这个功能是否启用的开关,对应

Settings.Global.getInt(getApplicationContext().getContentResolver(), "aa_key_switch_case_function_enabled",0)==1

还需要在statusbar.xml里面加一个控件

<TextViewandroid:id="@+id/input_status"android:layout_width="wrap_content"android:layout_height="match_parent"android:gravity="center_vertical"android:text="@string/input_case"android:visibility="gone"/>

后面发现在短信界面联想功能会乱,于是实体按键的时候就把联想功能去掉:

在拉丁输入法LatinIME.java里面修改:

if (!/*latinIme.mSettings.getCurrent().isSuggestionsEnabledPerUserSettings()*/false) {// mod by cscreturn;}

Android 九宫格物理键盘数字英文切换相关推荐

  1. android关闭物理键盘,设备有物理键盘,如何关掉软键盘?

    我使用的是android版的手持终端,带有物理键盘,在app中需要关掉软键盘,反复试验了以下几种方法,都没有效果,请问如何解决? static hideSoftInput(){ var Context ...

  2. Android获取物理键盘按键的keycode

    有时候,我们需要获取键盘按键的keycode值来对某个按键设置相应功能,这时候可以通过以下几种方法获取按键的keycode值: 1.通过onKeyDown()方法打印按键的keycode值 在Acti ...

  3. android accessibility 模拟键盘事件_H5 键盘兼容性小结

    在 H5 项目中,我们会经常遇到页面中存在单个甚至多个 input/textarea 输入框与底部固定元素的布局情况.在 input/textarea 输入框获取焦点时,会自动触发键盘弹起,而键盘弹出 ...

  4. Android 输入框(EditText)的输入限制,数字英文邮箱,可见\隐藏切换,踩过的坑!

    目录 一.输入框的输入限制 1.在xml文件里通过设置属性限制输入 2.在代码里动态设置输入限制 二.密码可见性切换和遇到的坑 最近做到了登录注册模块的各种输入判定,监听等等,因为需求上的需要,还是搞 ...

  5. appium android数字字母切换键,Android自定义键盘:数字键盘和字母键盘

    在项目中,产品对于输入方式会有特殊的要求,需要对输入方式增加特定的限制,这就需要采用自定义键盘.本文主要讲述数字键盘和字母键盘的自定义实现. 自定义键盘的实现步骤如下: 自定义CustomKeyboa ...

  6. android动态设置EditText显示英文带数字键盘

    开启软键盘和隐藏软键盘 //软键盘控制器 InputMethodManagerimm =(InputMethodManager)getActivity().getSystemService(Conte ...

  7. android 物理键盘 字符,Android物理键盘事件解析

    前言 Android设备连接物理键盘其实是个挺小众的需求,其实Android设备本身就是支持物理键盘,dispatchKeyEvent()这个方法就可以监听物理键盘,这里提供一个封装的类,解析键盘事件 ...

  8. 解决Android 5.1物理键盘与软键盘的同时使用

    在android 5.1系统中插入扫码枪物理设备后,软键盘无法弹出的问题. 1. 在代码frameworks/base/services/core/java/com/android/server/wm ...

  9. android外接键盘打汉字,Android在外接物理键盘时,如何强制调用系统软键盘

    Android在外接物理键盘时,如何强制调用系统软键盘? 第一次写,写的不好请见谅 参考: 物理键盘映射过程: 手机/system/usr/keylayout/*.kl :内核将keyCode映射成有 ...

最新文章

  1. golang中的jwt
  2. 12C OCP 1Z0-063 题库(8月以前)
  3. pajek软件使用方法_使用Jco远程连接SAP软件系统方法
  4. 《ArcGIS Runtime SDK for Android开发笔记》——(3)、ArcGIS Runtime SDK概述
  5. 剪纸风格的美妆海报设计,你试过吗?
  6. android 更新apk 应用为安装,应用未安装!从Android Studio构建安装APK时出错 - java
  7. 泱脏武器库之 CVE 2021-4034 Polkit 提权小结
  8. varchar和varchar2的区别
  9. 软件测试简历上的职业技能怎么写,软件测试岗位个人技能范文
  10. linux shell题库,shell习题-30
  11. vi 和 vim 编辑器的使用
  12. 报错笔记-[error] 1615#0: *14 open() “/usr/local/nginx/html/course/zk.jpg“ failed (2: No such file or dir
  13. 背包模块的设计(日常任务模块, 武器排行榜, 战术, 英雄战斗力, 活动模块)
  14. Android 向联系人名单新加联系人(添加名称和电话号码两项)
  15. 使用QPST刷机时报ERROR: function: main:314 Could not connect to \\.\COM3
  16. 树莓派 EC20 mini pcie 开机自动拨号
  17. 一文看尽2019 MWC十大新机
  18. easyX像素鸟PixelBird
  19. 【手把手教你学51单片机】中断的优先级
  20. CAPL编程中的思想:if...else...判断语句还能这么玩

热门文章

  1. 外包,你是外包不是正式员工,麻烦不要随便吃公司零食
  2. 【论文解读】文本分类上分利器:Bert微调trick大全
  3. 【Node.js】论一个低配版Web实时通信库是如何实现的1( WebSocket篇)
  4. ubuntu git clone 报错error: RPC failed; curl 56 GnuTLS recv error (-9): A TLS packet with unexpected
  5. 在Android Studio上编写第一个安卓程序
  6. Android安卓——Android程序生命周期
  7. 每天重启mycat的好处_路由器需要每天都关吗?其实很多人都弄错了
  8. 哪款国产ESD二极管可直接替代LC3311CCW?
  9. 【本/硕毕业生】开题报告及论文指导思路和撰写事项的整理
  10. 橙狮Scratch编程