天天看點

AccessibilityService+WindowManager+SurfaceView開系統權限

一種通過自動擷取使用者權限增強産品體驗的方法

  本文是基于輔助功能+懸浮窗+SurfaceView來實作自動擷取使用者權限的具體方案設計與實作。輔助功能搶紅包插件相信大家并不陌生,但是微信官方不允許,但是在工具軟體領域還是可以大顯身手,特别是開權限。輔助功能的作用就是實作節點查找和模拟點選,而懸浮窗實作需要的蒙層遮罩效果,SurfaceView則是實作流程的過渡動畫。

1、   什麼是輔助功能

       輔助功能其實是一個Android系統提供給的一種服務,本身是繼承Service類的。這個服務提供了增強的使用者界面,旨在幫助殘障人士或者可能暫時無法與裝置充分互動的人們。

  許多Android使用者有不同的需求,要求它們以不同的方式與他們的Android裝置進行互動。這包括使用者視覺、實體或年齡限制,防止他們完全看到或使用觸摸屏,和使用者與聽力損失可能無法感覺聲音和警報資訊。 Android提供了輔助功能服務更容易幫助這些使用者導航裝置,包括語音、觸覺回報、手勢導航,軌迹球和directional-pad導航。Android應用程式開發人員可以利用這些服務使應用程式更容易。 Android開發者也可以建立自己的輔助功能服務,可以提供增強的可用性特性,比如音頻提示實體回報和替代導航模式。輔助功能服務可以為所有應用程式提供這些增強功能,一組應用程式或隻是一個單一的應用程式。

       本文正是利用輔助功能服務提供的這些增強功能,實作在Android裝置權限界面上查找到我們需要的節點資訊,然後進行模拟點選。整個點選過程通過一個懸浮窗蒙層遮住,在懸浮窗上面通過SurfaceView實作一個不搶占和阻塞UI線程的一個過渡動畫來與使用者進行互動。

2、   整體方案流程

2.1.   整體功能流程圖

AccessibilityService+WindowManager+SurfaceView開系統權限

圖2-1 整體方案流程圖 

2.2.   權限資料管理流程

AccessibilityService+WindowManager+SurfaceView開系統權限

圖2-2 資料管理流程圖

3、   功能架構設計與實作

3.1.   架構子產品設計

  整個架構可分為輔助功能服務子產品,權限資料控制子產品,界面控制子產品。輔助功能服務子產品主要負責接收并篩選輔助功能回調事件,查找頁面節點,并實作模拟點選。權限資料控制子產品,主要負責控制雲端庫檔案的下拉更新以及權限庫檔案的解析。界面控制子產品主要控制整體權限開啟流程,開啟前的引導,開啟過程中的蒙層上流暢的過渡動畫,以及開啟成功或失敗後的狀态提示。整體功能子產品圖3-1如下所示,整體架構圖如圖3-2所示。

AccessibilityService+WindowManager+SurfaceView開系統權限

3-1 整體功能子產品圖

AccessibilityService+WindowManager+SurfaceView開系統權限

圖3-2 整體架構圖

下面依次從輔助功能服務子產品,權限資料控制子產品,界面控制子產品來描述具體的實作。

3.2.   輔助功能子產品實作原理

       自定義一個服務類AccessibilitySampleService(這個命名可以随意),繼承系統的AccessibilityService并覆寫onAccessibilityEvent和onInterrupt方法。編寫好服務類之後,在系統配置檔案(AndroidManifest.xml)中注冊服務。完成前面兩個步驟就完成了基本發輔助功能服務注冊與配置,具體的功能實作需要在onAccessibilityEvent中完成,根據onAccessibilityEvent回調方法傳遞過來的AccessibilityEvent對象可以對事件進行過濾,結合AccessibilitySampleService本身提供的查找節點與模拟點選相關的接口即可實作權限節點的查找與點選。

輔助功能服務類實作

AccessibilityService+WindowManager+SurfaceView開系統權限

輔助功能服務注冊與配置

在工程res目錄下建立xml檔案夾,新增accessibility_config.xml配置檔案,内容如下:

AccessibilityService+WindowManager+SurfaceView開系統權限

在AndroidManifest中配置輔助功能服務

AccessibilityService+WindowManager+SurfaceView開系統權限

實作節點查找(這裡是按文本進行查找,沒有用View的ID)并點選

AccessibilityService+WindowManager+SurfaceView開系統權限

擷取根節點

AccessibilityService+WindowManager+SurfaceView開系統權限

實作模拟點選

AccessibilityService+WindowManager+SurfaceView開系統權限

3.3.   權限資料控制子產品實作原理

       此子產品邏輯比較獨立,重點是權限庫檔案的設計與解析,庫檔案包括的内容就是每個機型的各個權限是以的頁面的基本資訊,比如權限的ID,權限名稱,權限開啟子步驟,權限所在頁面路徑等。庫檔案使用json檔案格式描述,便于解析與維護。

       權限庫檔案設計好之後,需要做雲端更新,便于能做快速适配,及時修複問題。雲端更新時需要設定好版本控制,設定好庫檔案的更新機制,比如是一天更新一次,還是每次使用功能時都檢測是否需要更新,控制對本地庫檔案的覆寫機制,避免将錯誤的資料替換掉本地正确的資料。另外要規定好本地庫檔案的路徑,友善程式對其進行解析。

單個權限節點配置資訊如下:

AccessibilityService+WindowManager+SurfaceView開系統權限

       delay_time屬性代表點選前的等待加載時間,type_id是權限對應的id(這是自定義的),describe屬性是對權限的一個描述(友善庫檔案的閱讀而已),intent屬性代表這個權限所在的包名跟具體的類名(這是最重要的,跳轉就靠這個屬性),step代碼開啟這個權限所需的步驟,find_node屬性表示要在這個頁面查找什麼節點。至于庫檔案的設計格式這個依賴于程式的設計,可以不一樣,隻要知道原理即可。

3.4.   界面控制控制子產品實作原理

       界面控制子產品主要是控制整體流程的互動,為了避免讓使用者看到開啟權限的過程,需要使用Android的懸浮窗,在啟動開啟權限流程之後,實作一個懸浮窗覆寫在最頂層。并且在懸浮窗蒙層上面提供目前的進度與提示,告訴使用者目前在做什麼,做了多少。

       在開啟權限的過程中,所有的操作幾乎都是在UI線程裡面工作的,是以蒙層上如果用普通的動畫方式實作的話,是會卡頓的,影響使用者體驗。是以在本發明中,使用了非阻塞UI線程的方式實作,那就是使用自定義SurfaceView實作自定義動畫。因為SurfaceView的繪制在單獨的繪制線程裡面執行的,不會搶占UI線程的資源,不會對權限開啟流程造成任何負面影響,反而減少了開啟權限所需要的整體時間。另外在SurfaceView中實作流暢的過渡動畫,減少使用者等待時間,一直與使用者有互動,增強使用者體驗。

懸浮窗蒙層上實作的動畫效果如下所示:

AccessibilityService+WindowManager+SurfaceView開系統權限

4、   總結

       本方法使用輔助功能自動開啟權限,提供了可配置式的權限開啟清單,具有很強的拓展性和可維護性,開啟過程使用懸浮窗蒙層遮蓋使得使用者無需擔憂,并且在蒙層上使用流暢的過渡動畫和提示與使用者進行友好互動,提升了産品體驗,不再卡頓,不再有漫長的等待。這樣能夠減少因誤觸導緻權限開啟流程被中斷的情況,同時能夠提升使用者的權限開啟率和權限的開啟成功率,進而提升軟體的功能活躍,提升功能留存。

輔助功能Sample位址

本文中的所說的方案完整源碼涉及公司資訊安全,是以并沒有提供。下面提供一個輔助功能基本使用的項目位址,後面也會抽離一部分代碼加進去。

https://github.com/PopFisher/AccessibilitySample

繼續閱讀