本文是基於輔助功能+懸浮窗+SurfaceView來實現自動獲取用戶權限的具體方案設計與實現。輔助功能搶紅包插件相信你們並不陌生,可是微信官方不容許,可是在工具軟件領域仍是能夠大顯身手,特別是開權限。輔助功能的做用就是實現節點查找和模擬點擊,而懸浮窗實現須要的蒙層遮罩效果,SurfaceView則是實現流程的過渡動畫。node
輔助功能實際上是一個Android系統提供給的一種服務,自己是繼承Service類的。這個服務提供了加強的用戶界面,旨在幫助殘障人士或者可能暫時沒法與設備充分交互的人們。git
許多Android用戶有不一樣的需求,要求它們以不一樣的方式與他們的Android設備進行交互。這包括用戶視覺、物理或年齡限制,防止他們徹底看到或使用觸摸屏,和用戶與聽力損失可能沒法感知聲音和警報信息。 Android提供了輔助功能服務更容易幫助這些用戶導航設備,包括語音、觸覺反饋、手勢導航,軌跡球和directional-pad導航。Android應用程序開發人員能夠利用這些服務使應用程序更容易。 Android開發者也能夠創建本身的輔助功能服務,能夠提供加強的可用性特性,好比音頻提示物理反饋和替代導航模式。輔助功能服務能夠爲全部應用程序提供這些加強功能,一組應用程序或只是一個單一的應用程序。github
本文正是利用輔助功能服務提供的這些加強功能,實如今Android設備權限界面上查找到咱們須要的節點信息,而後進行模擬點擊。整個點擊過程經過一個懸浮窗蒙層遮住,在懸浮窗上面經過SurfaceView實現一個不搶佔和阻塞UI線程的一個過渡動畫來與用戶進行交互。json
圖2-1 總體方案流程圖 安全
圖2-2 數據管理流程圖微信
整個框架可分爲輔助功能服務模塊,權限數據控制模塊,界面控制模塊。輔助功能服務模塊主要負責接收並篩選輔助功能回調事件,查找頁面節點,並實現模擬點擊。權限數據控制模塊,主要負責控制雲端庫文件的下拉更新以及權限庫文件的解析。界面控制模塊主要控制總體權限開啓流程,開啓前的引導,開啓過程當中的蒙層上流暢的過渡動畫,以及開啓成功或失敗後的狀態提示。總體功能模塊圖3-1以下所示,總體框架圖如圖3-2所示。框架
3-1 總體功能模塊圖工具
圖3-2 總體框架圖動畫
下面依次從輔助功能服務模塊,權限數據控制模塊,界面控制模塊來描述具體的實現。spa
自定義一個服務類AccessibilitySampleService(這個命名能夠隨意),繼承系統的AccessibilityService並覆寫onAccessibilityEvent和onInterrupt方法。編寫好服務類以後,在系統配置文件(AndroidManifest.xml)中註冊服務。完成前面兩個步驟就完成了基本發輔助功能服務註冊與配置,具體的功能實現須要在onAccessibilityEvent中完成,根據onAccessibilityEvent回調方法傳遞過來的AccessibilityEvent對象能夠對事件進行過濾,結合AccessibilitySampleService自己提供的查找節點與模擬點擊相關的接口便可實現權限節點的查找與點擊。
輔助功能服務類實現
輔助功能服務註冊與配置
在工程res目錄下新建xml文件夾,新增accessibility_config.xml配置文件,內容以下:
在AndroidManifest中配置輔助功能服務
實現節點查找(這裏是按文本進行查找,沒有用View的ID)並點擊
獲取根節點
實現模擬點擊
此模塊邏輯比較獨立,重點是權限庫文件的設計與解析,庫文件包括的內容就是每一個機型的各個權限因此的頁面的基本信息,好比權限的ID,權限名稱,權限開啓子步驟,權限所在頁面路徑等。庫文件使用json文件格式描述,便於解析與維護。
權限庫文件設計好以後,須要作雲端更新,便於能作快速適配,及時修復問題。雲端更新時須要設置好版本控制,設置好庫文件的更新機制,好比是一天更新一次,仍是每次使用功能時都檢測是否須要更新,控制對本地庫文件的覆蓋機制,避免將錯誤的數據替換掉本地正確的數據。另外要規定好本地庫文件的路徑,方便程序對其進行解析。
單個權限節點配置信息以下:
delay_time屬性表明點擊前的等待加載時間,type_id是權限對應的id(這是自定義的),describe屬性是對權限的一個描述(方便庫文件的閱讀而已),intent屬性表明這個權限所在的包名跟具體的類名(這是最重要的,跳轉就靠這個屬性),step代碼開啓這個權限所需的步驟,find_node屬性表示要在這個頁面查找什麼節點。至於庫文件的設計格式這個依賴於程序的設計,能夠不同,只要知道原理便可。
界面控制模塊主要是控制總體流程的交互,爲了不讓用戶看到開啓權限的過程,須要使用Android的懸浮窗,在啓動開啓權限流程以後,實現一個懸浮窗覆蓋在最頂層。而且在懸浮窗蒙層上面提供當前的進度與提示,告訴用戶當前在作什麼,作了多少。
在開啓權限的過程當中,全部的操做幾乎都是在UI線程裏面工做的,因此蒙層上若是用普通的動畫方式實現的話,是會卡頓的,影響用戶體驗。因此在本發明中,使用了非阻塞UI線程的方式實現,那就是使用自定義SurfaceView實現自定義動畫。由於SurfaceView的繪製在單獨的繪製線程裏面執行的,不會搶佔UI線程的資源,不會對權限開啓流程形成任何負面影響,反而減小了開啓權限所須要的總體時間。另外在SurfaceView中實現流暢的過渡動畫,減小用戶等待時間,一直與用戶有交互,加強用戶體驗。
懸浮窗蒙層上實現的動畫效果以下所示:
本方法使用輔助功能自動開啓權限,提供了可配置式的權限開啓列表,具備很強的拓展性和可維護性,開啓過程使用懸浮窗蒙層遮蓋使得用戶無需擔心,而且在蒙層上使用流暢的過渡動畫和提示與用戶進行友好交互,提高了產品體驗,再也不卡頓,再也不有漫長的等待。這樣可以減小因誤觸致使權限開啓流程被中斷的狀況,同時可以提高用戶的權限開啓率和權限的開啓成功率,從而提高軟件的功能活躍,提高功能留存。
輔助功能Sample地址
本文中的所說的方案完整源碼涉及公司信息安全,因此並無提供。下面提供一個輔助功能基本使用的項目地址,後面也會抽離一部分代碼加進去。