您當前的位置:首頁 > 攝影

這個工具竟然可以自動開啟手機所有許可權?來看看吧!

作者:由 劉陽 發表于 攝影時間:2022-07-03

先上程式碼,直接執行試試吧

liuyanggithub/AutoPermission

前情提要

之前在

方便聊(點選跳轉)

裡面用到了輔助模式來自動複製微信訊息,然後語音播放,今天再來發掘一下輔助功能的其他能力。

其實輔助功能說白了就是模擬使用者點選,在模擬使用者點選的基礎上,就可以做太多的事情,比如之前的搶紅包外掛、自動跳過廣告、遊戲輔助等等。不過今天要說的這個功能,可能普通使用者不太喜歡,方便了開發者,因為這個功能是自動開啟敏感許可權(修改系統設定、懸浮窗等需要使用者手動開啟的許可權)。

從配置輔助功能開始

還是一步一步來,先來配置輔助許可權

新建輔助功能類

新建一個類繼承AccessibilityService,再使用單例模式返回例項

public

class

AccessibilityServiceMonitor

extends

AccessibilityService

{

private

static

AccessibilityServiceMonitor

mAccessibilityServiceMonitor

public

static

AccessibilityServiceMonitor

getInstance

()

{

if

mAccessibilityServiceMonitor

==

null

{

// Toast。makeText(MyApplication。getInstance(), “輔助服務未開啟”, Toast。LENGTH_SHORT)。show();

}

return

mAccessibilityServiceMonitor

}

@Override

public

void

onCreate

()

{

mAccessibilityServiceMonitor

=

this

}

@Override

public

void

onServiceConnected

()

{

super

onServiceConnected

();

//可以做一些開啟後的操作比如點兩下返回

Log

d

TAG

“onServiceConnected: ”

);

mAccessibilityServiceMonitor

=

this

}

}

Manifest檔案配置

在AndroidManifest。xml檔案中配置服務

<

service

android

name

=

“com。example。autopermission。server。AccessibilityServiceMonitor”

android

enabled

=

“true”

android

exported

=

“true”

android

label

=

“@string/asm_name”

android

permission

=

“android。permission。BIND_ACCESSIBILITY_SERVICE”

>

<

intent

-

filter

>

<

action

android

name

=

“android。accessibilityservice。AccessibilityService”

/>

intent

-

filter

>

<

meta

-

data

android

name

=

“android。accessibilityservice”

android

resource

=

“@xml/accessibility_config”

>

meta

-

data

>

service

>

這裡有幾個引數需要注意:

android:label

是顯示在系統設定裡面的輔助模式列表的標題提示

android:resource

這裡是當前輔助模式的配置檔案,具體配置看下一步

輔助配置檔案

在res資料夾下新建xml資料夾,然後新建檔案accessibility_config。xml

<

accessibility

-

service

xmlns

android

=

“http://schemas。android。com/apk/res/android”

android

accessibilityEventTypes

=

“typeAllMask”

android

accessibilityFeedbackType

=

“feedbackGeneric”

android

accessibilityFlags

=

“flagReportViewIds”

android

canRetrieveWindowContent

=

“true”

android

description

=

“@string/readme”

android

notificationTimeout

=

“100”

/>

同樣這裡需要說明一下這些引數的含義

android:accessibilityEventTypes

可以模擬哪些事件

typeAllMask

全域性事件

typeViewClicked

點選事件

android:accessibilityFeedbackType

反饋的型別

feedbackGeneric

通用反饋

feedbackAudible

聲音反饋

feedbackSpoken

語音反饋

android:accessibilityFlags

配置之後可以透過node節點來getViewIdResourceName()獲取對應的節點的id

android:canRetrieveWindowContent

是否允許我們的程式讀取視窗中的節點和內容,當然是true

android:description

在開啟輔助功能設定介面的簡介,用於介紹應用需要使用輔助功能來幹嘛

android:packageNames

指定監聽哪些應用的包名,這裡沒配置代表監聽所有應用的視窗活動

實現連續動作

我們要開啟一個許可權,這是個連續的動作。首先需要跳轉到相對應的設定介面,然後點選開啟按鈕,最後返回到我們的應用,可是我們要怎麼來實現這樣的連續動作呢?可以這麼來思考,必然執行完一步之後,要傳送一個訊息,然後收到訊息又執行下一步,如此反覆。順著這個思路來,要處理訊息和執行,那就想到了使用

Handler

傳送延時訊息來完成這些動作。

這裡我們用一個工具類來處理這些跳轉和其它相關的程式碼,當然也需要是單例,然後在裡面新建一個handler例項來處理訊息。

public

class

ASMAutoUtils

{

static

ASMAutoUtils

mASMAutoUtils

private

final

DelayedHandler

mHandler

public

static

ASMAutoUtils

getInstance

()

{

if

mASMAutoUtils

==

null

{

mASMAutoUtils

=

new

ASMAutoUtils

();

}

return

mASMAutoUtils

}

class

DelayedHandler

extends

Handler

{

@Override

public

void

handleMessage

Message

msg

{

super

handleMessage

msg

);

}

}

}

接上一段,我們已經知道有至少兩種行為,一個是跳轉,一個是點選,然後可以想到還有一個就是結束訊息。所以這裡定義三個訊息型別

public

static

final

int

WHAT_JUMP

=

1

//跳轉

public

static

final

int

WHAT_FIND

=

2

//查詢節點,用於點選

public

static

final

int

WHAT_COMPLETE

=

3

;//

當前流程結束

定義完訊息之後,在handler的handleMessage方法裡面來做處理

class

DelayedHandler

extends

Handler

{

@Override

public

void

handleMessage

Message

msg

{

super

handleMessage

msg

);

switch

msg

what

{

case

WHAT_JUMP

break

case

WHAT_FIND

break

case

WHAT_COMPLETE

break

}

}

}

}

定義具體的行為

在知道如何實現流程之後,又遇到一個問題,就是怎麼來定義所有的動作。不同的許可權需要開啟不同的介面,不同的手機的按鈕id也不一定是相同的,還要執行返回操作。這就必然需要一個配置檔案來配置整個流程,所以我們可以用一個json檔案來定義整個流程,所有的行為。在新建資原始檔夾assets,然後新建一個json檔案step。json

{

“delay_time”

600

“type_id”

5

“describe”

“顯示在其他應用上面”

“intent”

{

“uriData”

“package&com。example。autopermission”

“actionName”

“android。settings。action。MANAGE_OVERLAY_PERMISSION”

},

“step”

{

“delay_time”

600

“find_text”

“其他應用”

“action_type”

“ACTION_CLICK”

“click_type”

“child”

“reality_node_name”

“android。widget。TextView”

“reality_node_id”

“:id/checkbox&:id/switch_widget&switch”

},

{

“click_type”

“system”

“delay_time”

600

“action_type”

“GLOBAL_ACTION_BACK”

}

},

{

“delay_time”

600

“type_id”

5

“describe”

“允許修改系統設定”

“intent”

{

“uriData”

“package&com。example。autopermission”

“actionName”

“android。settings。action。MANAGE_WRITE_SETTINGS”

},

“step”

{

“delay_time”

600

“find_text”

“修改系統設定”

“action_type”

“ACTION_CLICK”

“click_type”

“child”

“reality_node_name”

“android。widget。TextView”

“reality_node_id”

“:id/checkbox&:id/switch_widget&switch”

},

{

“click_type”

“system”

“delay_time”

600

“action_type”

“GLOBAL_ACTION_BACK”

}

}

這裡面定義了開啟顯示在其它應用上面和修改系統設定兩個許可權,具體步驟如下

使用action跳轉顯示在其他應用上面介面

查詢包含

其他應用

文字的textview,然後點選同檢視層級的switch或者checkbox(這裡用&符號配置不同的控制元件名稱)

執行ACTION_CLICK點選按鈕開啟

執行GLOBAL_ACTION_BACK返回到我們的應用

重複之上動作開啟修改系統設定許可權

至此我們就自動開啟了兩個許可權,並且還需要其它許可權的話也可以自己配置在json檔案中。所有許可權開起來也不是不可以。

怎樣知道不同手機的控制元件名稱呢

剛才我們發現了配置檔案裡面配置了三種類型的switch按鈕,那是怎麼知道不同手機的開關按鈕的名稱是什麼呢,這個時候就需要檢視分析工具了。這個工具在sdk資料夾的monitor。bat檔案,就可以開啟monitor工具,然後就可以分析應用的檢視樹。

這個工具竟然可以自動開啟手機所有許可權?來看看吧!

具體的程式碼地址如下,感興趣的小夥伴clone看看吧,別忘了star喲~

liuyanggithub/AutoPermission

標簽: Android  type  id  輔助  許可權