• Android随笔之——模拟按键操作的几种方式


      前几天转过一篇Android上模拟按键操作、触屏事件的博客,昨天又去找了百度、谷歌了一下,写了一点简单的测试代码,留待不时之需。有需要看之前转载的那篇博客的请看这里→_→转:Android随笔之——使用Root权限实现后台模拟全局按键、触屏事件方法(类似按键精灵),这里我就直接上代码了。

      

     1 package com.lsj.keyboardsample;
     2 
     3 import android.app.Activity;
     4 import android.app.Instrumentation;
     5 import android.os.Bundle;
     6 import android.view.KeyEvent;
     7 
     8 public class MainActivity extends Activity {
     9 
    10     @Override
    11     protected void onCreate(Bundle savedInstanceState) {
    12         super.onCreate(savedInstanceState);
    13         setContentView(R.layout.activity_main);
    14         // sendKeyCode1(KeyEvent.KEYCODE_MEDIA_STOP);
    15         sendKeyCode2(KeyEvent.KEYCODE_VOLUME_DOWN);
    16     }
    17 
    18     /**
    19      * 用Runtime模拟按键操作
    20      * 
    21      * @param keyCode
    22      *            按键事件(KeyEvent)的按键值
    23      */
    24     private void sendKeyCode1(int keyCode) {
    25         try {
    26             // 按键操作命令 11.24勘误,之前错误的写成了"input keycode"
    27             String keyCommand = "input keycode " + keyCode;
    28             // 调用Runtime模拟按键操作
    29             Runtime.getRuntime().exec(keyCommand);
    30         } catch (Exception e) {
    31             e.printStackTrace();
    32         }
    33     }
    34 
    35     /**
    36      * <pre>
    37      * 使用Instrumentation接口:对于非自行编译的安卓系统,无法获取系统签名,只能在前台模拟按键,不能后台模拟
    38      * 注意:调用Instrumentation的sendKeyDownUpSync方法必须另起一个线程,否则无效
    39      * @param keyCode
    40      *            按键事件(KeyEvent)的按键值
    41      * </pre>
    42      */
    43     private void sendKeyCode2(final int keyCode) {
    44         new Thread(new Runnable() {
    45             @Override
    46             public void run() {
    47                 try {
    48                     // 创建一个Instrumentation对象
    49                     Instrumentation inst = new Instrumentation();
    50                     // 调用inst对象的按键模拟方法
    51                     inst.sendKeyDownUpSync(keyCode);
    52                 } catch (Exception e) {
    53                     e.printStackTrace();
    54                 }
    55             }
    56         }).start();
    57     }
    58     
    59     /**
    60      * <pre>
    61      * 此方法使用反射调用系统IWindowManager隐藏API:兼容性较差,稳定性不好,容易出错。另外实际编译时发生错误,原因暂时不明。
    62      * 暂时还未掌握Java的反射机制,留待以后测试
    63      * @param keyCode
    64      * </pre>
    65      */
    66     private void sendKeyCode3(int keyCode) {
    67         /*此方法中那个的IWindowManager是不存在的,需要使用Java的反射机制才能实现*/
    68         /**
    69         final int keyCode = key;
    70         Thread sendKeyDelay = new Thread(){
    71             public void run() {
    72                 try {
    73                     Thread.sleep(100);
    74                     
    75                     long now = SystemClock.uptimeMillis();
    76                     KeyEvent keyDown = new KeyEvent(now, now, KeyEvent.ACTION_DOWN,
    77                             keyCode, 0);
    78                     IWindowManager wm = IWindowManager.Stub.asInterface(
    79                             ServiceManager.getService("window"));
    80                     wm.injectKeyEvent(keyDown, false);
    81                     
    82                     KeyEvent keyUp = new KeyEvent(now, now, KeyEvent.ACTION_UP,
    83                             keyCode, 0);
    84                     wm.injectKeyEvent(keyUp, false);
    85                 } catch (InterruptedException e) {
    86                     e.printStackTrace();
    87                 } catch (RemoteException e) {
    88                     e.printStackTrace();
    89                 }
    90             }
    91         };
    92         sendKeyDelay.start();
    93          */
    94     }
    95 
    96 }

    作者:登天路

    转载请说明出处:http://www.cnblogs.com/travellife/

  • 相关阅读:
    scrapy_redis对接布隆过滤器(Bloom Filter)
    Python-Scrapy shell 带头部headers请求
    postgres数据库入门, python 操作postgres
    Windows下安装MySQL详细教程
    在读取文件中出现ufeff,解决 ufeff的问题
    scrapy中主动停止爬虫
    Scrapy 中Filtered offsite request to 'www.sohu.com':报错的解决方法
    win10系统谷歌插件此扩展程序可能已损坏的解决方法
    如何将已经安装从chrome扩展程序导出备份为.CRX文件?
    PAC模式和全局模式的区别
  • 原文地址:https://www.cnblogs.com/travellife/p/4107434.html
Copyright © 2020-2023  润新知