如何在安卓系统中发送按键事件?

12

我正在制作一个自定义导航栏给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 权限。我该怎么办?

9个回答

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

嘿,在这种情况下,targetView是什么,如果用户在主屏幕上,如何提取它。谢谢。 - user2430771

7
以下是关于罗马数字的精准解释:罗马数字
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);

能否发送任何类型的键?所有Unicode字符都可以吗? - android developer

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 ... 来输入文本。

嗨,我尝试使用这个来实现我的返回按钮,但它没有起作用。我正在构建用于Android 4.4.3的应用。已经搜索了很多资料一个星期,但是到目前为止还没有成功。谢谢。 - user2430771
4
如果您使用这种方法,您需要获取 root 权限。 - Huiyu
2
这个问题需要root权限,因为代码中使用了以下命令: Runtime.getRuntime().exec(new String[] { "su", "-c","input keyevent "+KeyEvent.KEYCODE }); - UdayaLakmal

4

对我来说有效:

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();
}

1
当我使用这些方法时,它会给我关于INJECT_EVENTS权限的错误。所以我遵循了这个帖子:https://dev59.com/Am435IYBdhLWcg3wfgMf?rq=1. 当我在清单文件中包含android.permission.INJECT_EVENTS权限时,它会抛出一个错误,说该权限已经授予系统应用程序。我该如何包含这个权限?谢谢。 - user2430771

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));

请告诉我这是否有帮助!


KEYCODE_BACK 用于模拟返回按钮操作,要生成点击事件需要同时使用 ACTION_DOWN 和 ACTION_UP。 - Ishaan

2

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

步骤1:您需要获取设备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将被启用。


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”替换为您的Activity名称。


0

还有InputConnectionsendKeyEvent函数。InputConnection仅适用于API Level 3。


0

我不想监听事件,我想发送事件(返回键),如何使用AccessibilityService在代码中实现? - Ashraf Alshahawy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接