Android 系统下模拟触点击的功能与权限

最近在研究手机与车载设备之间互联的功能,有一些问题不是很清楚,特别 Android 的功能。所以分别在 WinCE 和 Android 的论坛发了一个帖子,希望可以得到大牛的指点。帖子链接如下:

WinCE:  WinCE 设备如何通过 USB 与 Android 手机互联?

Android: Android 应用如何模拟触屏点击动作?

得到了大家的积极回复,很多问题有了一定的答案。虽然到目前为止,还没有彻底的将技术问题搞通,但也差不了多少了!


通过 Instrumentation 来模拟屏幕点击,在本应用的界面,不用增加如下的处理也可以正常响应。但本应用后台运行后,想控制其它的应用或系统应用时,出现权限不允许的错误。

在一台已经 ROOT 的设备上,且在 manifest 中增加了:
  1. <uses-permission android:name="android.permission.INJECT_EVENTS" />  

调用如下函数,让应用获取 ROOT 的权限后,本应用后台运行后模拟屏幕点击仍然出错。
  1. public static boolean runRootCommand(String command) {  
  2.     Process process = null;  
  3.     DataOutputStream os = null;  
  4.     try {  
  5.         process = Runtime.getRuntime().exec("su");  
  6.         os = new DataOutputStream(process.getOutputStream());  
  7.         os.writeBytes(command + "\n");  
  8.         os.writeBytes("exit\n");  
  9.         os.flush();  
  10.         process.waitFor();  
  11.     } catch (Exception e) {  
  12.         Log.d(TAG,  "the device is not rooted,  error message: " + e.getMessage());  
  13.         return false;  
  14.     } finally {  
  15.         try {  
  16.             if (os != null) {  
  17.             os.close();  
  18.         }  
  19.         if(process != null) {  
  20.             process.destroy();  
  21.         }  
  22.         } catch (Exception e) {  
  23.             e.printStackTrace();  
  24.         }  
  25.     }  
  26.     return true;  
  27. }  

错误输出如下:
  1. 09-29 09:36:18.424: E/AndroidRuntime(1872): FATAL EXCEPTION: Thread-12  
  2. 09-29 09:36:18.424: E/AndroidRuntime(1872): java.lang.SecurityException: Injecting to another application requires INJECT_EVENTS permission  
  3. 09-29 09:36:18.424: E/AndroidRuntime(1872):     at android.os.Parcel.readException(Parcel.java:1353)  
  4. 09-29 09:36:18.424: E/AndroidRuntime(1872):     at android.os.Parcel.readException(Parcel.java:1307)  
  5. 09-29 09:36:18.424: E/AndroidRuntime(1872):     at android.view.IWindowManager$Stub$Proxy.injectPointerEvent(IWindowManager.java:949)  
  6. 09-29 09:36:18.424: E/AndroidRuntime(1872):     at android.app.Instrumentation.sendPointerSync(Instrumentation.java:937)  
  7. 09-29 09:36:18.424: E/AndroidRuntime(1872):     at com.jia.leozhengfirstapp.SocketClient$SocketReceiveThread.run(SocketClient.java:439)  


1) 模拟屏幕点击实现的方法一
  1. // 模拟屏幕点击事件 - 只在 Activity 中有用  
  2. public void setMouseClick(){  
  3.     MotionEvent evenDownt = MotionEvent.obtain(System.currentTimeMillis(), System.currentTimeMillis() + 100,  
  4.     MotionEvent.ACTION_DOWN, 1004000);  
  5.   dispatchTouchEvent(evenDownt);  
  6.   MotionEvent eventUp = MotionEvent.obtain(System.currentTimeMillis(), System.currentTimeMillis() + 100,  
  7.         MotionEvent.ACTION_UP, 1004000);  
  8.   dispatchTouchEvent(eventUp);  
  9.   evenDownt.recycle();  
  10.   eventUp.recycle();  
  11. }  

2) 模拟屏幕点击实现的方法二
  1. // 可以不用在 Activity 中增加任何处理,各 Activity 都可以响应  
  2. Instrumentation inst = new Instrumentation();  
  3. inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(),   
  4.     MotionEvent.ACTION_DOWN, 2005000));  
  5. inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(),   
  6.     MotionEvent.ACTION_UP, 2005000));  


解决此问题,看来只有一种途径了: 获取系统权限。按网上的描述,有以下两种方法: 
(1) 在源码中编译(需要在 Linux 环境下执行)
(2) 手动添加系统签名(较为麻烦,但不必进入 Linux 环境,在 Windows 环境下就能操作)
以上方法也是有缺陷的: 这样生成的程序只有在原始的 Android 系统或者是自己编译的系统中才可以用,因为这样的系统才可以拿到platform.pk8和platform.x509.pem两个文件。
要是别家公司做的 Android 上连安装都安装不了。
试试原始的 Android 中的 key 来签名,程序在模拟器上运行 OK,不过放到 G3 上安装直接提示:
"Package ... has no signatures that match those in shared user android.uid.system",这样也是保护了系统的安全

转自:http://blog.csdn.net/91program/article/details/39669725

参考链接:Android adb shell 获得点击屏幕的位置坐标

Android在任何地方模拟点击屏幕 http://blog.csdn.net/hai29785/article/details/52769307

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值