本论坛将全面搬家到:http://www.cnblogs.com/91program,请大家以后来这里看看。
最近在研究手机与车载设备之间互联的功能,有一些问题不是很清楚,特别 Android 的功能。所以分别在 WinCE 和 Android 的论坛发了一个帖子,希望可以得到大牛的指点。帖子链接如下:
WinCE: WinCE 设备如何通过 USB 与 Android 手机互联?
Android: Android 应用如何模拟触屏点击动作?
得到了大家的积极回复,很多问题有了一定的答案。虽然到目前为止,还没有彻底的将技术问题搞通,但也差不了多少了!
通过 Instrumentation 来模拟屏幕点击,在本应用的界面,不用增加如下的处理也可以正常响应。但本应用后台运行后,想控制其它的应用或系统应用时,出现权限不允许的错误。
在一台已经 ROOT 的设备上,且在 manifest 中增加了:
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)
// 模拟屏幕点击事件 - 只在 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();
}
// 可以不用在 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));