Android 系统下模拟触点击的功能与权限
2014-09-29 14:46
357 查看
最近在研究手机与车载设备之间互联的功能,有一些问题不是很清楚,特别 Android 的功能。所以分别在 WinCE 和 Android 的论坛发了一个帖子,希望可以得到大牛的指点。帖子链接如下:
WinCE: WinCE 设备如何通过 USB 与 Android 手机互联?
Android: Android 应用如何模拟触屏点击动作?
得到了大家的积极回复,很多问题有了一定的答案。虽然到目前为止,还没有彻底的将技术问题搞通,但也差不了多少了!
通过 Instrumentation 来模拟屏幕点击,在本应用的界面,不用增加如下的处理也可以正常响应。但本应用后台运行后,想控制其它的应用或系统应用时,出现权限不允许的错误。
在一台已经 ROOT 的设备上,且在 manifest 中增加了:
调用如下函数,让应用获取 ROOT 的权限后,本应用后台运行后模拟屏幕点击仍然出错。
错误输出如下:
1) 模拟屏幕点击实现的方法一
2) 模拟屏幕点击实现的方法二
解决此问题,看来只有一种途径了: 获取系统权限。按网上的描述,有以下两种方法:
(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",这样也是保护了系统的安全。
WinCE: WinCE 设备如何通过 USB 与 Android 手机互联?
Android: Android 应用如何模拟触屏点击动作?
得到了大家的积极回复,很多问题有了一定的答案。虽然到目前为止,还没有彻底的将技术问题搞通,但也差不了多少了!
通过 Instrumentation 来模拟屏幕点击,在本应用的界面,不用增加如下的处理也可以正常响应。但本应用后台运行后,想控制其它的应用或系统应用时,出现权限不允许的错误。
在一台已经 ROOT 的设备上,且在 manifest 中增加了:
<uses-permission android:name="android.permission.INJECT_EVENTS" />
调用如下函数,让应用获取 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-12 09-29 09:36:18.424: E/AndroidRuntime(1872): java.lang.SecurityException: Injecting to another application requires INJECT_EVENTS permission 09-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",这样也是保护了系统的安全。
相关文章推荐
- Android 系统下模拟触点击的功能与权限
- Android 系统下模拟触点击的功能与权限
- Android 将系统的back键模拟成为home键的功能
- Android开发:实现系统自带截屏功能 需要获取System权限
- 让Android程序获得系统的权限,实现关机重启,静默安装等功能
- android-系统功能权限调用
- Android调用系统相机、相册功能,适配6.0权限获取以及7.0以后获取URI(兼容多版本)
- android远程控制(三)----通过后台服务实现系统点击事件模拟
- android 模拟点击按键功能(android 4.4)
- Android订票系统订票功能实现(特效点击按钮实现票数自动加减1)
- 让Android程序获得系统权限,实现关机重启,静默安装等功能
- Android中可通过二维码扫描,直接显示个人名片信息,而且可以点击添加,调用系统的添加联系人功能
- Android调用系统短信功能,点击返回键返回短信列表而不返回app的问题!
- Android模拟点击屏幕,实现按键精灵点击屏幕功能
- Android系统上实现类似按键精灵的效果(模拟触屏点击事件)
- 让Android程序获得系统的权限,实现关机重启,静默安装等功能
- 让Android程序获得系统的权限,实现关机重启,静默安装等功能
- android:检查系统是否开启消息通知权限,app应用点击开启通知时跳转到app详情页面开启权限
- 让Android程序获得系统的权限,实现关机重启,静默安装等功能
- C#.NET通用权限管理系统组件中数据集权限设置功能增加内部组织机构选项功能