描述: IWindowManager 提供了模拟 KeyEvents的简单方法,名字叫做 IWindowManager.injectKeyEvent(...). 要模拟KeyStroke(按键敲击), 我们需要模拟一个 指定KeyCode 的 KeyEvent.ACTION_DOWN 和 KeyEvent.ACTION_UP
.
在这个例子里我们将要模拟 Menu按键的 KeyStroke , 以使 Menu 弹出.
下面是这个例子的源码
- package org.anddev.android.simualtekeys;
-
- import android.app.Activity;
- import android.os.Bundle;
- import android.os.DeadObjectException;
- import android.os.ServiceManager;
- import android.view.IWindowManager;
- import android.view.KeyEvent;
- import android.view.Menu;
- import android.view.View;
- import android.view.View.OnClickListener;
-
- public class SimualteKeyInput extends Activity {
-
-
- final IWindowManager windowManager = IWindowManager.Stub
- .asInterface(ServiceManager.getService("window"));
-
-
- @Override
- public void onCreate(Bundle icicle) {
- super.onCreate(icicle);
- setContentView(R.layout.main);
-
-
- this.findViewById(R.id.cmd_simulate_key).setOnClickListener(
- new OnClickListener() {
- @Override
- public void onClick(View arg0) {
-
-
- new Thread(new Runnable() {
- public void run() {
-
- simulateKeystroke(KeyEvent.KEYCODE_SOFT_LEFT);
- }
- }).start();
- }
- });
- }
-
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- boolean supRetVal = super.onCreateOptionsMenu(menu);
- menu.add(0, 0, "Awesome it works =)");
- return supRetVal;
- }
-
-
-
- private void simulateKeystroke(int KeyCode) {
- doInjectKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyCode));
- doInjectKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyCode));
- }
-
-
- private void doInjectKeyEvent(KeyEvent kEvent) {
- try {
-
- windowManager.injectKeyEvent(kEvent.isDown(), kEvent.getKeyCode(),
- kEvent.getRepeatCount(), kEvent.getDownTime(), kEvent
- .getEventTime(), true);
- } catch (DeadObjectException e) {
- e.printStackTrace();
- }
- }
- }
[java] view plain copy print ?
- package org.anddev.android.simualtekeys;
-
- import android.app.Activity;
- import android.os.Bundle;
- import android.os.DeadObjectException;
- import android.os.ServiceManager;
- import android.view.IWindowManager;
- import android.view.KeyEvent;
- import android.view.Menu;
- import android.view.View;
- import android.view.View.OnClickListener;
-
- public class SimualteKeyInput extends Activity {
-
-
- final IWindowManager windowManager = IWindowManager.Stub
- .asInterface(ServiceManager.getService("window"));
-
-
- @Override
- public void onCreate(Bundle icicle) {
- super.onCreate(icicle);
- setContentView(R.layout.main);
-
-
- this.findViewById(R.id.cmd_simulate_key).setOnClickListener(
- new OnClickListener() {
- @Override
- public void onClick(View arg0) {
-
-
- new Thread(new Runnable() {
- public void run() {
-
- simulateKeystroke(KeyEvent.KEYCODE_SOFT_LEFT);
- }
- }).start();
- }
- });
- }
-
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- boolean supRetVal = super.onCreateOptionsMenu(menu);
- menu.add(0, 0, "Awesome it works =)");
- return supRetVal;
- }
-
-
-
- private void simulateKeystroke(int KeyCode) {
- doInjectKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyCode));
- doInjectKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyCode));
- }
-
-
- private void doInjectKeyEvent(KeyEvent kEvent) {
- try {
-
- windowManager.injectKeyEvent(kEvent.isDown(), kEvent.getKeyCode(),
- kEvent.getRepeatCount(), kEvent.getDownTime(), kEvent
- .getEventTime(), true);
- } catch (DeadObjectException e) {
- e.printStackTrace();
- }
- }
- }
package org.anddev.android.simualtekeys;
import android.app.Activity;
import android.os.Bundle;
import android.os.DeadObjectException;
import android.os.ServiceManager;
import android.view.IWindowManager;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
public class SimualteKeyInput extends Activity {
/* The WindowManager capable of injecting keyStrokes. */
final IWindowManager windowManager = IWindowManager.Stub
.asInterface(ServiceManager.getService("window"));
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
/* Make the button do the menu-popup. */
this.findViewById(R.id.cmd_simulate_key).setOnClickListener(
new OnClickListener() {
@Override
public void onClick(View arg0) {
/* Start the key-simulation in a thread
* so we do not block the GUI. */
new Thread(new Runnable() {
public void run() {
/* Simulate a KeyStroke to the menu-button. */
simulateKeystroke(KeyEvent.KEYCODE_SOFT_LEFT);
}
}).start(); /* And start the Thread. */
}
});
}
/** Create a dummy-menu. */
@Override
public boolean onCreateOptionsMenu(Menu menu) {
boolean supRetVal = super.onCreateOptionsMenu(menu);
menu.add(0, 0, "Awesome it works =)");
return supRetVal;
}
/** Wrapper-function taking a KeyCode.
* A complete KeyStroke is DOWN and UP Action on a key! */
private void simulateKeystroke(int KeyCode) {
doInjectKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyCode));
doInjectKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyCode));
}
/** This function actually handles the KeyStroke-Injection. */
private void doInjectKeyEvent(KeyEvent kEvent) {
try {
/* Inject the KeyEvent to the Window-Manager. */
windowManager.injectKeyEvent(kEvent.isDown(), kEvent.getKeyCode(),
kEvent.getRepeatCount(), kEvent.getDownTime(), kEvent
.getEventTime(), true);
} catch (DeadObjectException e) {
e.printStackTrace();
}
}
}
XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
androidrientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Button id="@+id/cmd_simulate_key"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Simulate Menu Key Press"
/>
</LinearLayout>