如何在android中发送关键事件?

时间:2012-10-23 08:39:53

标签: android android-event

我正在修改Android 4.0.3.r1的自定义导航栏,并希望发送关键事件,如" Home"和"返回"。我的申请不是一个系统:

IWindowManager mWindowManager = IWindowManager.Stub.asInterface(
                ServiceManager.getService(Context.WINDOW_SERVICE));
mWindowManager.injectKeyEvent( ev, false );

它不起作用,因为我无法从系统应用程序中获取android.permission.INJECT_EVENTS。我怎么能这样做?

9 个答案:

答案 0 :(得分:4)

BaseInputConnection  mInputConnection = new BaseInputConnection(targetView, true);
mInputConnection.sendKeyEvent(new KeyEvent(...));

答案 1 :(得分:3)

你可以试试这个

try
{
    String keyCommand = "input keyevent " + KeyEvent.KEYCODE_MENU;
    Runtime runtime = Runtime.getRuntime();
    Process proc = runtime.exec(keyCommand);
}
catch (IOException e)
{
    // TODO Auto-generated catch block
    e.printStackTrace();
}

当然,您可以选择命令input text ...来输入文本。

答案 2 :(得分:2)

这些都不是有效的。要使用以下代码进入主屏幕。

Intent home = new Intent(Intent.ACTION_MAIN);
home.addCategory(Intent.CATEGORY_HOME);
//home.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(home);

如果您没有从activity / fragment调用,则可能必须取消注释标记部分。 如果回到下面,代码可以在某些设备上运行。

dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK));
dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK));

请告诉我这是否有帮助!

答案 3 :(得分:1)

以下是Roman回答的精确度

BaseInputConnection  mInputConnection = new BaseInputConnection( findViewById(R.id.main_content), true);
KeyEvent kd = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MENU);
KeyEvent ku = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MENU);
mInputConnection.sendKeyEvent(kd);
mInputConnection.sendKeyEvent(ku);

答案 4 :(得分:1)

我以前也遇到过同样的问题,我通过下面的方式解决了KEY_INJECT_EVENT_PERMISSION问题。

第1步:您需要获取Device ROM的签名(对我来说,文件名为signapk)。

步骤2:然后,您需要获取platform.pk8和platform.x509.pem文件。

第3步:生成应用程序的调试apk。

第4步:将上述所有文件放在一个文件夹中。

第5步:获得所有上述文件后,请运行下面提到的命令。

java -jar signapk.jar platform.x509.pem platform.pk8 your_debug_app.apk customname.apk

第6步:此后,您可以在同一文件夹中获得一个签名的apk(customname.apk)。一旦获得,请运行以下命令。

adb install -r app-release-signed.apk

第7步:现在将启用Inject_Event_Permisson。

答案 5 :(得分:0)

还有InputConnection的{​​{1}}功能。 sendKeyEvent仅为API级别3。

答案 6 :(得分:0)

恢复旧线程 - 您可以使用相对较新的辅助功能API执行主页和后退 - 请在此处查看“performGlobalAction”: http://developer.android.com/reference/android/accessibilityservice/AccessibilityService.html

(特别是GLOBAL_ACTION_HOME和GLOBAL_ACTION_BACK操作)

当然,您需要对辅助功能服务具有适当的权限,但这不需要root

答案 7 :(得分:0)

你可以试试这个。

long now = SystemClock.uptimeMillis();
BaseInputConnection mInputConnection = new BaseInputConnection(findViewById(R.id.MainActivity), true);
KeyEvent down = new KeyEvent(now, now, KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_HOME, 0);
mInputConnection.sendKeyEvent(down);

此代码对我有用。

注意:请记住将“R.id.MainActivity”替换为您的活动名称。

答案 8 :(得分:-1)

它对我有用:

public static void simulateKey(final int KeyCode) {

    new Thread() {
        @Override
        public void run() {
            try {
                Instrumentation inst = new Instrumentation();
                inst.sendKeyDownUpSync(KeyCode);
            } catch (Exception e) {
                Log.e("Exception when sendKeyDownUpSync", e.toString());
            }
        }

    }.start();
}