2010-11-12 33 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(); 
    } 
} 
相關問題