Android 2.3frameworks/base/core/java/android/app/Instrumentation.java: public void sendPointerSync(MotionEvent event){IWindowManager.Stub.asInterface(ServiceManager.getService("window"))).injectPointerEvent(event, true)frameworks/base/services/java/com/android/server/WindowManagerService.java: final InputManager mInputManager;public boolean injectPointerEvent(MotionEvent ev, boolean sync)final int result = mInputManager.injectInputEvent(newEvent, pid, uid, sync ? InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_FINISH : InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_RESULT, INJECTION_TIMEOUT_MILLIS);frameworks/base/services/java/com/android/server/InputManager.java: public int injectInputEvent(InputEvent event, int injectorPid, int injectorUid, int syncMode, int timeoutMillis) { if (event == null) { throw new IllegalArgumentException("event must not be null"); } if (injectorPid throw new IllegalArgumentException("injectorPid and injectorUid must not be negative."); } if (timeoutMillis throw new IllegalArgumentException("timeoutMillis must be positive"); } return nativeInjectInputEvent(event, injectorPid, injectorUid, syncMode, timeoutMillis); }frameworks/base/services/jni/com_android_server_InputManager.cpp:static jint android_server_InputManager_nativeInjectInputEvent(JNIEnv* env, jclass clazz,frameworks/base/services/jni/com_android_server_InputManager.cpp: { "nativeInjectInputEvent", "(Landroid/view/InputEvent;IIII)I",return gNativeInputManager->getInputManager()->getDispatcher()->injectInputEvent(& motionEvent, injectorPid, injectorUid, syncMode, timeoutMillis);mInputManager = new InputManager(eventHub, this, this);Android 4.0:\frameworks\base\core\java\android\app\Instrumentation.javapublic void sendPointerSync(MotionEvent event) { validateNotAppThread(); if ((event.getSource() & InputDevice.SOURCE_CLASS_POINTER) == 0) { event.setSource(InputDevice.SOURCE_TOUCHSCREEN); } InputManager.getInstance().injectInputEvent(event, InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH); }\frameworks\base\core\java\android\hardware\input\InputManager.javaprivate final IInputManager mIm; public boolean injectInputEvent(InputEvent event, int mode) { if (event == null) { throw new IllegalArgumentException("event must not be null"); } if (mode != INJECT_INPUT_EVENT_MODE_ASYNC && mode != INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH && mode != INJECT_INPUT_EVENT_MODE_WAIT_FOR_RESULT) { throw new IllegalArgumentException("mode is invalid"); } try { return mIm.injectInputEvent(event, mode); } catch (RemoteException ex) { return false; } }\frameworks\base\services\java\com\android\server\input\InputManagerService.java public boolean injectInputEvent(InputEvent event, int mode) { if (event == null) { throw new IllegalArgumentException("event must not be null"); } if (mode != InputManager.INJECT_INPUT_EVENT_MODE_ASYNC && mode != InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH && mode != InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_RESULT) { throw new IllegalArgumentException("mode is invalid"); } final int pid = Binder.getCallingPid(); final int uid = Binder.getCallingUid(); final long ident = Binder.clearCallingIdentity(); final int result; try { result = nativeInjectInputEvent(mPtr, event, pid, uid, mode, INJECTION_TIMEOUT_MILLIS, WindowManagerPolicy.FLAG_DISABLE_KEY_REPEAT); } finally { Binder.restoreCallingIdentity(ident); } switch (result) { case INPUT_EVENT_INJECTION_PERMISSION_DENIED: Slog.w(TAG, "Input event injection from pid " + pid + " permission denied."); throw new SecurityException( "Injecting to another application requires INJECT_EVENTS permission"); case INPUT_EVENT_INJECTION_SUCCEEDED: return true; case INPUT_EVENT_INJECTION_TIMED_OUT: Slog.w(TAG, "Input event injection from pid " + pid + " timed out."); return false; case INPUT_EVENT_INJECTION_FAILED: default: Slog.w(TAG, "Input event injection from pid " + pid + " failed."); return false; } }Note:Inject event to Android system need system permission. 11-02 12:29