Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在android中发送关键事件?_Android_Android Event - Fatal编程技术网

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

如何在android中发送关键事件?,android,android-event,Android,Android Event,我正在为安卓4.0.3.r1添加一个自定义导航栏,并希望发送“主页”和“返回”等关键事件。我的申请不是一个系统,因此: IWindowManager mWindowManager = IWindowManager.Stub.asInterface( ServiceManager.getService(Context.WINDOW_SERVICE)); mWindowManager.injectKeyEvent( ev, false ); 它不起作用,因为我无法从

我正在为安卓4.0.3.r1添加一个自定义导航栏,并希望发送“主页”和“返回”等关键事件。我的申请不是一个系统,因此:

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

它不起作用,因为我无法从not系统应用程序获取
android.permission.INJECT\u EVENTS
。我怎样才能做到这一点呢?

还有
InputConnection
sendKeyEvent
功能<代码>输入连接只是API级别3。

它对我有效:

BaseInputConnection  mInputConnection = new BaseInputConnection(targetView, true);
mInputConnection.sendKeyEvent(new KeyEvent(...));
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();
}
你可以试试这个

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

当然,您可以选择command
input text…
来输入文本。

恢复旧线程-您可以使用相对较新的辅助功能API执行Home和Back操作-查看此处的“performGlobalAction”:

(特别是全球行动家庭和全球行动家庭)

当然,对于辅助功能服务,您需要适当的权限,但这并不需要root用户,您可以尝试此操作

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

这些都无效。要从以下代码转到主屏幕

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

让我知道这是否有帮助

这里有一些精确的答案


我以前也遇到过同样的问题,我用下面的方法解决了key\u INJECT\u EVENT\u权限问题

步骤1:您需要获得设备ROM的签名(对我来说,文件名是signapk)

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

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

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

步骤5:一旦你得到了上面所有的文件,运行下面提到的命令

java-jar signapk.jar platform.x509.pem platform.pk8您的\u debug\u app.apk customname.apk

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

adb安装-r app-release-signed.apk


步骤7:现在将启用注入事件权限。

有人将我的问题从“如何在android中发送关键事件?”编辑为“如何在android中处理关键事件?”因此我想知道如何发送关键事件。嘿,在这种情况下,targetView是什么,如果用户在主屏幕上,如何提取它。谢谢如果我使用这些方法,它会给我关于INJECT_EVENTS权限的错误。所以我关注这篇文章:。当我在清单文件中包含权限android.permission.INJECT_事件时,它会抛出一个错误,即授予系统应用程序权限。我怎样才能包括这个许可?谢谢,我试着用这个来实现我的后退按钮,但没有成功。我正在为安卓4.4.3构建。我已经找了一个星期了,但是到目前为止没有成功。感谢如果使用此方法,则需要获取root previlegeThis require问题,root为Runtime.getRuntime().exec(新字符串[]{“su”、“-c”、“input keyevent”+keyevent.KEYCODE});我不想听事件,我想发送事件(返回键),如何使用AccessibilityService在代码中实现它?返回键用于模拟返回按钮动作,生成点击事件需要动作向下和动作向上。
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);