本论坛将全面搬家到: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系统原理与开发要点详解
  2. Android与Unity交互调用mUnityPlayer.quit()方法退出返回上一个A
  3. Android 操作系统的内存回收机制
  4. Android札记【2】——系统的认识心中的Android[首届 Google 暑期
  5. Unity3D调用android方法(非插件方式)
  6. Android事件处理方法总结-Handler消息处理
  7. Android系统资源

随机推荐

  1. android 以太网设置静态ip
  2. Android(安卓)下通过 HTTP 获取天气 API(
  3. mtk android lcm调试
  4. android 使用OkHttpClient上传文件到服务
  5. android读写文件权限管理
  6. Android----View
  7. android整合--UI基本控件Button,ImageBut
  8. 自定义菜单
  9. Android之AIDL跨进程抛异常的原理
  10. android耳机插入\拔出事件上报流程