這個工具竟然可以自動開啟手機所有許可權?來看看吧!
先上程式碼,直接執行試試吧
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
上一篇:高效估計開方和e