代码之家  ›  专栏  ›  技术社区  ›  Marvin

如何将运行中的应用程序作为KeyEvent的目标?

  •  4
  • Marvin  · 技术社区  · 14 年前

    我的目标是以keyevent为目标,在后台服务的前台或后台运行特定的应用程序。

    我试过很多办法,但还没有成功。

    尝试的少数解决方案(全部来自运行服务的后台):


    通过广播,我尝试将第一个应用程序(例如电话应用程序)作为目标,该应用程序将管理密钥事件

    KeyEvent lKey1Up = new KeyEvent(KeyEvent.ACTION_UP,KeyEvent.KEYCODE_ENDCALL);
    KeyEvent lKey1Dwn = new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_ENDCALL);
    Intent lKey1UpIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
    Intent lKey1DwnIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
    lKey1UpIntent.putExtra(Intent.EXTRA_KEY_EVENT, lKey1Up);
    lKey1DwnIntent.putExtra(Intent.EXTRA_KEY_EVENT, lKey1Dwn );
    sendOrderedBroadcast(lKey1UpIntent, null);
    sendOrderedBroadcast(lKey1DwnIntent, null);
    

    =>当我处于通话状态(OFFHOOK)时执行广播时,前台电话应用程序不会发生任何变化。事实上,我几乎可以肯定这不会起作用,因为我没有办法具体针对手机应用程序。


    仪表 ,我尝试将目标对准具有焦点的应用程序:

    Instrumentation lInst  = new Instrumentation();
    KeyEvent lKey1Up = new KeyEvent(KeyEvent.ACTION_UP,KeyEvent.KEYCODE_1);
    KeyEvent lKey1Dwn = new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_1);
    lInst.sendKeySync(lKey1Up);
    lInst.sendKeySync(lKey1Dwn);
    

    lInst.sendKeyDownUpSync(KeyEvent.KEYCODE_1)
    

    =>应用程序崩溃(也在电话呼叫期间) 看来我不能出于测试目的而使用仪器


    superDispatchKeyEvent(KeyEvent)
    

    但由于我不知道如何从目标运行的应用程序中定位特定的窗口(实际上,我的服务中没有窗口),所以我根本不知道如何使用它。


    在别人问之前,我加了

    android.permission.INJECT_事件
    android.permission.modify_PHONE_状态

    为了确保我所做的一切都是“允许的”。

    然后。。。首先感谢您在此之前的阅读,现在:

    • 你们中有些人知道我该怎么做 使用 来自服务的击键事件?
    • 你们中的一些人知道如何对手机应用程序做同样的具体操作吗?

    提前谢谢你的帮助。

    2 回复  |  直到 14 年前
        1
  •  3
  •   CommonsWare    14 年前

    我的目标是以keyevent为目标,在后台服务的前台或后台运行特定的应用程序。

    这是不可能的,因为这是一个安全漏洞。允许应用程序A将关键事件注入应用程序B会引发各种各样的恶意软件可能性。

        2
  •  0
  •   Artificioo    8 年前

    根设备 :

    public static void inputKeyEvent(String keyCodeString) {
        try {
            int keyCode = Integer.parseInt(keyCodeString);
            try {
                Instrumentation m_Instrumentation = new Instrumentation();
                m_Instrumentation.sendKeyDownUpSync(keyCode);
            } catch (SecurityException e) {
                try {
                    Process processKeyEvent = Runtime.getRuntime().exec("/system/xbin/su");
                    DataOutputStream os = new DataOutputStream(processKeyEvent.getOutputStream());
                    os.writeBytes("input keyevent " + keyCode + "\n");
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
                e.printStackTrace();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }