簡體   English   中英

如何創建一個可以在用戶玩另一個應用程序時捕獲全局觸摸屏事件的 Android 應用程序?

[英]How to create an Android app that can capture the global touch screen events when user is playing with another app?

正如標題所說,在我的研究中,我需要記錄用戶觸摸屏事件,主要是用戶使用另一個應用程序時的手勢(如點擊、滾動、滑動等)。 目前我想不出一個好的方法。 似乎對於Android 4.x 觸摸屏事件無法讀出? 任何人都知道捕獲觸摸事件的任何好方法?

我也在很長一段時間內進行研發,以在 ANDROID 應用程序中獲取全局觸摸事件。

實際上,我們的要求是從 ANDROID 應用程序內部捕獲手機上的觸摸坐標。

我們嘗試了幾種方法:

1-首先我們嘗試在手機屏幕上方放置一個透明布局(例如在手機屏幕上方放置一層玻璃),然后接收觸摸事件並動態移除玻璃,以便事件可以傳遞到玻璃下方和然后再次動態插入玻璃。 但缺點是它需要兩次敲擊,這是不可行的(因為第一次敲擊會給出觸摸坐標,第二次觸摸會在玻璃下方傳遞)。

2- 然后我們嘗試在窗口管理器中使用一個特殊標志,即 flag_watch_outside_touch,通過使透明布局大小為 1 X 1,但我們得到的觸摸坐標為 (0,0),因為 Android 框架強加了安全性,其他進程無法在內部獲取觸摸點其他過程。

3-然后我們嘗試通過代碼運行命令“adb shell getevents”,但它不接受觸摸事件(盡管通過使用“adb shell sendevent”我們能夠發送全局觸摸事件,即通過傳遞我們能夠傳遞的坐標設備屏幕上特定坐標上的事件。

4- 現在我們非常確定,如果沒有root,任何應用程序都無法獲得將在其他應用程序進程中發生的全局觸摸事件。 Android 安全性不允許這樣做,否則任何應用程序都可以使用密碼或其他用戶輸入數據。

但是......我們必須這樣做(沒有生根)......

5-現在我們嘗試使用shell腳本並從命令提示符執行getevent命令並將觸摸事件重定向到文件並解析觸摸事件以獲得可讀坐標..

所以我們無法通過代碼捕獲應用程序內的全局觸摸事件,但是我們可以通過從 adb shell 執行 getevent 命令從操作系統級別捕獲。 我們可以通過將其存儲到手機存儲中的外部存儲來傳遞給 android 應用程序。

希望這對大家有幫助。

謝謝,

由於安全和隱私原因(正如 SC 爵士所提到的),除非您已扎根,否則這是不可能的。

我已經嘗試了多種方法(甚至在 Stackoverflow 上問了一個問題: Android - Inactivity/Activity 不考慮頂級應用程序)。 我得出的結論是,使用“無障礙服務”是我們最接近了解用戶何時觸摸屏幕的方法。 然而,這並不是萬無一失的。 您不會為每次屏幕觸摸都獲得一個事件(在 Chrome 中滾動不會產生任何事件)。


話雖如此,如果您的應用程序可以依賴根解決方案,那么就可以監聽來自getevent ( https://source.android.com/devices/tech/input/getevent.html ) 的傳入線路。 這些行只是提供觸摸(和其他)事件的詳細信息。 但這需要 root 訪問權限,因此它可能不是一個可接受的解決方案。

我認為您應該已經找到了這個,但它“可能”是唯一可以幫助您解決此問題的庫,因為出於安全和隱私原因,您無法直接在活動之間進行交互:

GitHub android-global-touchevent

不確定是否將此作為評論或答案發布,但我懷疑由於安全問題,這應該是不可能的。 如果您可以監視其他應用程序中的活動,而不會對用戶顯而易見,那么您可能會不恰當地監視其他應用程序的密碼輸入。 因此,如果不支持此類活動,我不會感到驚訝。

正如 amarnathpatel 所說,在沒有 root 的情況下幾乎不可能獲得觸摸事件。但是有一個鍛煉,通過它我們可以獲得事件但不是坐標。它是使用 FLAG_WATCH_OUTSIDE_TOUCH 完成的。 看看這個

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM