2010-11-12 131 views
3

我的目标是以keyevent为目标,从后台服务运行在前台或后台的特定应用程序。如何使用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) 

=>应用崩溃(在通话期间) 看起来像我不能使用Instrumentation出于测试目的


最后,我想过用

superDispatchKeyEvent(KeyEvent) 

但因为我不知道如何定位从目标运行的应用程序特定的窗口(和我没有在我的服务的确如此),我根本不知道如何使用它。


而且有人问之前,我添加了

android.permission.INJECT_EVENTS
android.permission.MODIY_PHONE_STATE

在我的清单,以确保所有我做的被允许”。

然后...首先感谢阅读到这里,现在:

  • 一些你知道我可以设法 做目标从一个服务 击键事件的特定应用程序?
  • 你们中的一些人知道如何针对电话应用程序做相同的处理?

在此先感谢您的帮助。

+0

你已经找到了解决这个? – steven0529 2014-12-09 01:54:46

+0

2年前我停止了对iOs的工作......并且从来没有找到一个“干净的方式来做到这一点”。但是我确信这已经演变了很多,你现在可能会发现新的技巧 – Marvin 2014-12-09 16:43:15

回答

2

我的目标是针对一个keyevent一个特定的应用程序运行在后台服务的前景或背景。

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

+0

嗨,谢谢你的回复。我担心这样的答案。我将继续寻找一种方法来做到这一点,但它绝对看起来像我永远不会设法这样做 – Marvin 2010-11-15 08:41:09

+0

INJECT权限只允许系统特权应用程序... – LittleFunny 2016-11-14 10:51:08

0

您可以使用这样的事情,但需要扎根设备

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(); 
    } 
} 
相关问题