Android 代码模拟物理按键

开发中有遇到这样的情况,物理按键个数有限, 想用代码模拟其他物理按键输入,这里用了shell 命令在程序运行时环境里模拟按键事件。

因命令执行会阻塞线程, 所以最好是在子线程里执行命令:

 new Thread(){
            @Override
            public void run() {
                 execByRuntime("input keyevent 61");
            }
        }.start();

其实是通过shell 向系统发送一按键事件,来模拟物理按键。

 

61 是物理按键的Tab键

如果想模拟其他按键,换一下键值即可:

常用的按键keyCode :

KEYCODE_CALL拨号键5
KEYCODE_ENDCALL挂机键6
KEYCODE_HOME按键Home3
KEYCODE_MENU菜单82
KEYCODE_BACK返回键4
KEYCODE_SEARCH搜索84
KEYCODE_CAMERA拍照键27
KEYCODE_FOCUS拍照对焦键80
KEYCODE_POWER电源键26
KEYCODE_NOTIFICATION通知键83
KEYCODE_MUTE话筒静音键91
KEYCODE_VOLUME_MUTE扬声器静音键164
KEYCODE_VOLUME_UP音量增加键24
KEYCODE_VOLUME_DOWN音量减小键25
KEYCODE_ENTER回车键66
KEYCODE_ESCAPEESC键111
KEYCODE_DPAD_CENTER导航键 确定键23
KEYCODE_DPAD_UP导航键 向上19
KEYCODE_DPAD_DOWN导航键 向下20
KEYCODE_DPAD_LEFT导航键 向左21
KEYCODE_DPAD_RIGHT导航键 向右22
KEYCODE_MOVE_HOME光标移动到开始键122
KEYCODE_MOVE_END光标移动到末尾键123
KEYCODE_PAGE_UP向上翻页键92
KEYCODE_PAGE_DOWN向下翻页键93
KEYCODE_DEL退格键67
KEYCODE_FORWARD_DEL删除键112
KEYCODE_INSERT插入键124
KEYCODE_TABTab键61
KEYCODE_NUM_LOCK小键盘锁143
KEYCODE_CAPS_LOCK大写锁定键115
KEYCODE_BREAKBreak/Pause键121
KEYCODE_SCROLL_LOCK滚动锁定键116
KEYCODE_ZOOM_IN放大键168
KEYCODE_ZOOM_OUT缩小键169

 

下面是exec方法,可直接执行shell命令:

  /**
     * 执行shell 命令, 命令中不必再带 adb shell
     *
     * @param cmd
     * @return Sting  命令执行在控制台输出的结果
     */
    public static String execByRuntime(String cmd) {
        Process process = null;
        BufferedReader bufferedReader = null;
        InputStreamReader inputStreamReader = null;
        try {
            process = Runtime.getRuntime().exec(cmd);
            inputStreamReader = new InputStreamReader(process.getInputStream());
            bufferedReader = new BufferedReader(inputStreamReader);

            int read;
            char[] buffer = new char[4096];
            StringBuilder output = new StringBuilder();
            while ((read = bufferedReader.read(buffer)) > 0) {
                output.append(buffer, 0, read);
            }
            return output.toString();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        } finally {
            if (null != inputStreamReader) {
                try {
                    inputStreamReader.close();
                } catch (Throwable t) {
                    //
                }
            }
            if (null != bufferedReader) {
                try {
                    bufferedReader.close();
                } catch (Throwable t) {
                    //
                }
            }
            if (null != process) {
                try {
                    process.destroy();
                } catch (Throwable t) {
                    //
                }
            }
        }
    }

 

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值