本论坛将全面搬家到:http://www.cnblogs.com/91program,请大家以后来这里看看。


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

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

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

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


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

在一台已经 ROOT 的设备上,且在 manifest 中增加了:

调用如下函数,让应用获取 ROOT 的权限后,本应用后台运行后模拟屏幕点击仍然出错。
public static boolean runRootCommand(String command) {Process process = null;DataOutputStream os = null;try {process = Runtime.getRuntime().exec("su");os = new DataOutputStream(process.getOutputStream());os.writeBytes(command + "\n");os.writeBytes("exit\n");os.flush();process.waitFor();} catch (Exception e) {Log.d(TAG,  "the device is not rooted,  error message: " + e.getMessage());return false;} finally {try {if (os != null) {os.close();}if(process != null) {process.destroy();}} catch (Exception e) {e.printStackTrace();}}return true;}

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


1) 模拟屏幕点击实现的方法一
// 模拟屏幕点击事件 - 只在 Activity 中有用public void setMouseClick(){MotionEvent evenDownt = MotionEvent.obtain(System.currentTimeMillis(), System.currentTimeMillis() + 100,  MotionEvent.ACTION_DOWN, 100, 400, 0);  dispatchTouchEvent(evenDownt);  MotionEvent eventUp = MotionEvent.obtain(System.currentTimeMillis(), System.currentTimeMillis() + 100,  MotionEvent.ACTION_UP, 100, 400, 0);  dispatchTouchEvent(eventUp);  evenDownt.recycle();  eventUp.recycle();}

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

解决此问题,看来只有一种途径了: 获取系统权限。按网上的描述,有以下两种方法: 
(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",这样也是保护了系统的安全。

更多相关文章

  1. Android应用程序进程启动过程的源代码分析(1)
  2. Android(安卓)Runtime Permission 详解
  3. android socket通信(上)
  4. Android(安卓)第一课——Android架构
  5. Android(安卓)HttpURLConnection应用技巧分享
  6. Android应用程序注册广播接收器(registerReceiver)的过程分析
  7. Android应用程序注册广播接收器(registerReceiver)的过程分析
  8. Android官方开发指南翻译(1)-什么是Android
  9. android应用安全——签名机制

随机推荐

  1. android content provider概述
  2. android jUnit test 进行自动化测试
  3. android光照、加速度传感器
  4. android系统框架()
  5. 关于解决为什么设置控件居中等位置无反应
  6. Android: /cache中的文件是怎么消失的[转
  7. 【Android 初学】7、相对布局--初步入门
  8. android stagefright简介
  9. android传值方法之一
  10. android屏幕旋转在framework中的修改