Android AccessibilityService實(shí)現(xiàn)第三方APP行為捕獲

AccessibilityService實(shí)現(xiàn)行為捕獲

語音:Kotlin            版本:1.2.41
最近接到一個(gè)很奇葩的需求:捕獲系統(tǒng)語音通話聊天(包括微信榆苞、電話账忘、QQ),把通話內(nèi)容記錄成音頻文件上傳到服務(wù)端遍坟。
接到需求的第一時(shí)間當(dāng)然是度娘谷歌一陣,一頓亂搜之后發(fā)現(xiàn)并沒有太多能夠用來參考的文獻(xiàn)激挪。
沒有現(xiàn)成的輪子可用豆同,只能擼起袖子,自己動(dòng)手豐衣足食驹溃。

AccessibilityService簡介

AccessibilityService中文翻譯為輔助服務(wù)城丧,它能夠幫助我們獲取第三方應(yīng)用的操作信息。
AccessibilityService的所帶來的安全隱患在這里不多贅述豌鹤,主要介紹一些關(guān)于它的特性和用法亡哄。
本文章將用大家常用的微信來舉例,獲取微信語音通話界面的控件布局布疙,提取到關(guān)鍵常量之后蚊惯,用AccessibilityService來捕獲。
先來看一段官方對(duì)AccessibilityService的描述:

Accessibility services should only be used to assist users with disabilities in using Android devices and apps. They run in the background and receive callbacks by the system when AccessibilityEvents are fired. Such events denote some state transition in the user interface, for example, the focus has changed, a button has been clicked, etc. Such a service can optionally request the capability for querying the content of the active window. Development of an accessibility service requires extending this class and implementing its abstract methods.

Lifecycle

The lifecycle of an accessibility service is managed exclusively by the system and follows the established service life cycle. Starting an accessibility service is triggered exclusively by the user explicitly turning the service on in device settings. After the system binds to a service, it calls onServiceConnected(). This method can be overridden by clients that want to perform post binding setup.

An accessibility service stops either when the user turns it off in device settings or when it calls disableSelf().

從描述中我們可以得到如下幾個(gè)信息:

1.AccessibilityService只能用于幫助殘障人士使用Android設(shè)備和應(yīng)用灵临;

2.運(yùn)行在后臺(tái)截型,可以實(shí)現(xiàn)無感知運(yùn)作;

3.能夠監(jiān)測焦點(diǎn)的切換俱诸、點(diǎn)擊等事件菠劝;

4.APP只能對(duì)其進(jìn)行注冊(cè),無法自動(dòng)開啟;

5.啟動(dòng)AccessibilityService需要用戶進(jìn)入“設(shè)置-無障礙”手動(dòng)開啟赶诊,關(guān)閉亦是如此笼平。

放上官方文檔的鏈接(需爬梯):
https://developer.android.com/reference/android/accessibilityservice/AccessibilityService


AccessibilityService基本配置方式

創(chuàng)建MyAccessibilityService繼承AccessibilityService

覆寫onServiceConnected意敛、onAccessibilityEvent乾戏、onInterrupt方法蟆炊。

三個(gè)方法分別為AccessibilityService的三個(gè)生命周期楞陷。

可以大致理解為“服務(wù)啟動(dòng)時(shí)”缸剪、“服務(wù)監(jiān)聽中”蒿叠、“斷開服務(wù)”

/*
 * Create by parker
 * Author: parker
 * Create: 2018/12/7 10:48 AM
 *
 */
class MyAccessibilityService : AccessibilityService() {

    override fun onServiceConnected() {
        super.onServiceConnected()
    }

    override fun onAccessibilityEvent(event: AccessibilityEvent) {

    }

    override fun onInterrupt() {

    }
}
在AndroidManifest.xml中注冊(cè):
    <service
        android:name=".MyAccessibilityService"
        android:enabled="true"
        android:exported="false"
        android:label="@string/my_as"
        android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
        android:process=":BackgroundService">
        <intent-filter>
            <action android:name="android.accessibilityservice.AccessibilityService" />
        </intent-filter>
        <meta-data
            android:name="android.accessibilityservice"
            android:resource="@xml/accessibility_config" />
    </service>
在res下新建accessibility_config.xml文件:
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeAllMask"
    android:accessibilityFeedbackType="feedbackGeneric"
    android:canRetrieveWindowContent="true"
    android:notificationTimeout="100"
    android:description="@string/description"
    android:packageNames="com.tencent.mm" />
屬性作用如下:

android:description :輔助功能描述皿伺,描述該輔助功能用來干嘛的
android:packageNames :指定輔助功能監(jiān)聽的包名狐赡,不指定表示監(jiān)聽所有應(yīng)用
android:accessibilityEventTypes:輔助功能處理事件類型滋捶,一般配置為typeAllMask表示接收所有事件
android:accessibilityFlags:輔助功能查找截點(diǎn)方式痛悯,一般配置為flagDefault默認(rèn)方式。
android:accessibilityFeedbackType:操作相應(yīng)按鈕以后輔助功能給用戶的反饋類型重窟,包括聲音载萌,震動(dòng)等。
android:notificationTimeout:相應(yīng)時(shí)間設(shè)置
android:canRetrieveWindowContent:是否允許輔助功能獲得窗口的節(jié)點(diǎn)信息巡扇,為了能正常實(shí)用輔助功能扭仁,請(qǐng)務(wù)必保持該項(xiàng)配置為true

配置完成后將demo跑進(jìn)測試機(jī)器

進(jìn)入 設(shè)置→輔助服務(wù)→無障礙

如果在“無障礙”下出現(xiàn)我們配置的服務(wù),表示配置成功


實(shí)現(xiàn)微信語音電話狀態(tài)監(jiān)聽

監(jiān)聽工作流程如下:
·捕獲微信進(jìn)入聊天狀態(tài)
·啟動(dòng)語音錄制服務(wù)
·捕獲微信退出聊天狀態(tài)
·退出語音錄制服務(wù)

首先需要借助工具來分析微信的布局厅翔。通過捕獲微信布局中的關(guān)鍵常量乖坠,來判斷微信當(dāng)前的狀態(tài)。

布局分析工具

谷歌在AS 3.0之后刀闷,取消老舊的DDMS熊泵,為我們提供了界面更為友好的全新工具:LayoutInspector

打開方式:Tools → Lyaout Inspector 如圖:

屏幕快照 2018-12-07 上午11.37.37.png

點(diǎn)擊之后,系統(tǒng)彈出Choose Porcess提示我們選擇需要監(jiān)聽的進(jìn)程涩赢,這里我們選擇微信戈次,先不要點(diǎn)“OK”:

屏幕快照 2018-12-07 下午1.28.41.png

在微信上啟動(dòng)語音聊天,然后點(diǎn)擊Choose Process的OK筒扒,選擇VideoActivity,如圖:

屏幕快照 2018-12-07 下午1.30.13.png

捕獲到的微信聊天界面的布局如圖所示:

屏幕快照 2018-12-07 下午1.33.05.png

通過分析左邊的View Tree我們發(fā)現(xiàn)怯邪,微信中提示已接通、通話結(jié)束等狀態(tài)的控件id為eg7.
這是一個(gè)很有用的發(fā)現(xiàn)花墩,它的文本內(nèi)容可以直接作為判斷微信通話是否連接或者斷開的依據(jù)悬秉。


ok 知道了微信語音聊天了開始和結(jié)束的狀態(tài)判定依據(jù),接下來就是用代碼來實(shí)現(xiàn)監(jiān)聽的過程冰蘑。

核心代碼如下:

override fun onAccessibilityEvent(event: AccessibilityEvent){
    //獲取當(dāng)前界面的布局信息
    val noteInfo: AccessibilityNodeInfo = when {
        rootInActiveWindow != null -> rootInActiveWindow
        event.source != null -> event.source
        else -> return
    }

    //獲取id為eg7的控件  并根據(jù)內(nèi)容執(zhí)行相應(yīng)的操作
    val wechatToast = noteInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/eg7")
    //如果id為eg7的控件存在
    if (wechatToast.size>0){
        //判斷這個(gè)控件的內(nèi)容
        if (wechatToast[0].text.toString() == "已接通"){
            //此時(shí)語音聊天已經(jīng)接通
            //TODO:do something you want
        }else if (wechatToast[0].text.toString().contains("聊天結(jié)束")){
            //此時(shí)語音聊天已經(jīng)結(jié)束
            //TODO:do something you want
        }
    }
}

至此和泌,微信聊天狀態(tài)已經(jīng)捕獲完成,TODO處可實(shí)現(xiàn)語音錄制相關(guān)代碼祠肥。
語音錄制過程會(huì)在下一篇文章中詳細(xì)介紹武氓。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子县恕,更是在濱河造成了極大的恐慌东羹,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件忠烛,死亡現(xiàn)場離奇詭異属提,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)美尸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門冤议,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人师坎,你說我怎么就攤上這事恕酸。” “怎么了屹耐?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵尸疆,是天一觀的道長。 經(jīng)常有香客問我惶岭,道長,這世上最難降的妖魔是什么犯眠? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任按灶,我火速辦了婚禮,結(jié)果婚禮上筐咧,老公的妹妹穿的比我還像新娘鸯旁。我一直安慰自己,他們只是感情好量蕊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布铺罢。 她就那樣靜靜地躺著,像睡著了一般残炮。 火紅的嫁衣襯著肌膚如雪韭赘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天势就,我揣著相機(jī)與錄音泉瞻,去河邊找鬼。 笑死苞冯,一個(gè)胖子當(dāng)著我的面吹牛袖牙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播舅锄,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鞭达,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起畴蹭,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤烘贴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后撮胧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體桨踪,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年芹啥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了锻离。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡墓怀,死狀恐怖汽纠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情傀履,我是刑警寧澤虱朵,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站钓账,受9級(jí)特大地震影響碴犬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜梆暮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一服协、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧啦粹,春花似錦偿荷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至贪嫂,卻和暖如春寺庄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背撩荣。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來泰國打工铣揉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人餐曹。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓逛拱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親台猴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子朽合,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 用兩張圖告訴你俱两,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 12,714評(píng)論 2 59
  • afinalAfinal是一個(gè)android的ioc曹步,orm框架 https://github.com/yangf...
    wgl0419閱讀 6,279評(píng)論 1 9
  • 1宪彩、 github排名 https://github.com/trending,github搜索:https://...
    GB_speak閱讀 9,785評(píng)論 2 117
  • 迎合規(guī)后,投之人會(huì)走的更遠(yuǎn) 網(wǎng)貸職業(yè)自2007年進(jìn)入我國以來...
    kenan806閱讀 175評(píng)論 0 0
  • 連續(xù)幾天自己沒有能夠堅(jiān)持打坐讲婚,反而是在浪費(fèi)時(shí)間在無意義的網(wǎng)絡(luò)上面尿孔,也是沒有打坐的幾天自己感覺到內(nèi)心不平靜,好像是一...
    吾宗老孫子閱讀 300評(píng)論 0 1