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