11

我正在为 Android 4.0.3.r1 制作一个自定义导航栏,并希望发送诸如“Home”和“Back”之类的关键事件。因此,我的应用程序不是系统:

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

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

4

9 回答 9

5
BaseInputConnection  mInputConnection = new BaseInputConnection(targetView, true);
mInputConnection.sendKeyEvent(new KeyEvent(...));
于 2013-08-13T06:41:50.823 回答
5

这是罗马答案的一些精确度

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);
于 2017-01-13T15:58:55.263 回答
4

对我有用:</p>

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();
}
于 2013-08-26T17:15:17.497 回答
4

你可以试试这个

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 ...输入文本的命令。

于 2013-11-14T02:13:25.353 回答
2

这些都不是有效的。从使用下面的代码转到主屏幕。

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

如果您不是从活动/片段调用,则可能必须取消注释标志部分。回到下面的代码适用于某些设备。

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

让我知道这是否有帮助!

于 2016-09-26T15:29:56.730 回答
2

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

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

第二步:接下来需要获取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。

于 2019-09-11T12:23:07.783 回答
0

还有InputConnectionsendKeyEvent功能。InputConnection只是 API 级别 3。

于 2013-05-14T16:05:13.813 回答
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”替换为您的活动名称。

于 2016-08-18T11:22:34.910 回答
0

恢复旧线程 - 您可以使用相对较新的 Accessibility API 执行 Home 和 Back - 在此处查看“performGlobalAction”:http: //developer.android.com/reference/android/accessibilityservice/AccessibilityService.html

(特别是 GLOBAL_ACTION_HOME 和 GLOBAL_ACTION_BACK 动作)

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

于 2015-11-26T22:09:48.327 回答