相容微信v6.7.3的多圖分享方案

無法分享到微信
前些日子微信更新到了 v6.7.3 版本,傳統的多圖分享方式已經無效了。
微信 v6.7.3 版本以前的方案
微信在 v6.7.3 以前的版本提供了從系統相簿分享多圖到朋友圈的介面,具體使用如下:
val intent = Intent() intent.action = Intent.ACTION_SEND_MULTIPLE intent.component = ComponentName("com.tencent.mm", "com.tencent.mm.ui.tools.ShareToTimeLineUI") intent.type = "image/*" intent.putStringArrayListExtra(Intent.EXTRA_TEXT, arrayListOf(text)) intent.putExtra("Kdescription", text) // 傳遞多張圖片的 Uri 。 intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uriList) startActivity(intent)
使用以上程式碼,在微信 v6.7.3 以前可以正常分享,但是如果使用者把微信更新到 v6.7.3 版本,再使用該分案分享多圖就只能看到上面那張圖了。
跳轉微信 v6.7.3 圖文分享介面
雖然 v6.7.3 不能直接分享多圖了,但是介面其實還是保留了的,只要在傳遞引數 Intent.EXTRA_STREAM
時 urilList 中只攜帶 1 張圖片,還是可以跳轉到朋友圈圖文分享介面的。如下:

微信圖文分享介面
此介面和從朋友圈中通過選擇圖片後跳轉的介面是一模一樣的,不僅可以分享圖片,還可以傳送文字、定位、同步到QQ空間。
但是,僅僅開啟圖文分享介面是不行的,因為我們要的是多圖分享,而這裡只傳入了 1 張圖片。為了解決這個問題,需要用到 AccessibilityService
。
使用無障礙服務
無障礙服務是一個為殘疾人或可能暫時無法與裝置完全互動的人提供使用者介面擴充套件功能的服務。
從Android4.0(API級別14)開始,無障礙服務可以代表使用者操作,包含改變輸入焦點和選擇(啟用)使用者介面元素。在Android4.1(API級別16),操作的範圍被擴充套件至包含滾動列表和與文字域互動。無障礙服務也可採取全域性操作,如導航到主介面、按返回按鈕、開啟螢幕通知和最近應用列表。Android4.1也包含新焦點型別,無障礙焦點,該焦點型別可讓所有視覺元素能夠被無障礙服務所選擇。
這些新的能力讓開發者能夠開發替代導航模式,如手勢導航,提高殘障使用者對Android裝置的控制。
通過使用無障礙服務,可以監聽使用者手機介面和事件,並在特定事件產生時代替使用者執行一些操作。因此我們只要知道分析朋友圈圖文分享介面的事件,找到合適的事件幫助使用者自動填寫文字、自動選擇圖片即可。
注意:由於無障礙服務功能強大,因此 Android 系統對其進行了限制,必須使用者手動開啟 APP 開發的無障礙服務,才能產生作用。
事件分析
class WXShareMultiImageService : AccessibilityService() { override fun onAccessibilityEvent(event: AccessibilityEvent) { // 當視窗發生的事件是我們配置監聽的事件時,會回撥此方法.會被呼叫多次 } override fun onInterrupt() { //當服務要被中斷時呼叫.會被呼叫多次 } }
每次產生的事件都會發送到 onAccessibilityEvent
函式,通過列印 AccessibilityEvent
的內容分析事件,發現以下事件:
- 開啟圖文分享介面時產生的事件:
{ eventType : AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED className : com.tencent.mm.plugin.sns.ui.SnsUploadUI ... }
- 點選新增圖片的 + 號產生的事件:
{ eventType : AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED className : android.widget.ListView ... }
- 開啟圖片選擇介面的事件:
{ eventType : AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED className : com.tencent.mm.plugin.gallery.ui.AlbumPreviewUI ... }
分析圖文分享介面的 UI
使用 Android SDK 的 uiautomatorviewer
工具分析 UI,找到如下檢視:
- 文字編輯框(EditText)。
- 已選圖片列表(GridView),最後一個 Item 是【新增圖片按鈕】。
- 新增圖片方式列表(ListView),最後一個 Item 是【從相簿選擇】。
- 待選圖片列表(GridView)。
- 複選框(CheckBox),其實點選的不是 CheckBox,而是另一個不可見的 View。
- 【完成】選擇按鈕。
AccessibilityService
中獲取檢視節點的 3 種方式:
// 通過 id獲取節點。 rootNodeInfo.findAccessibilityNodeInfosByViewId(idString) // 通過文字獲取節點。 rootNodeInfo.findAccessibilityNodeInfosByText(text) // 遍歷子節點獲取指定節點。 fun findNodeInfo(rootNodeInfo: AccessibilityNodeInfo?, className: String): AccessibilityNodeInfo? { // 遍歷,具體內容請檢視原始碼。 }
微信每個版本的檢視 id 都不一樣,為了版本相容,不能使用 id 獲取節點。
通過 text 文字獲取節點只對有 text 屬性且有值的節點有效。
因此大多數節點通過遍歷子節點的形式獲取。
自動貼上
將待分享的文字複製到系統剪下板,如果使用者打開了無障礙服務,服務將自動貼上文字到輸入框,否則使用者也可以手動長按輸入框貼上。
val editText = findNodeInfo(rootInActiveWindow, EditText::class.java.name) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { // 貼上剪下板內容 editText?.performAction(AccessibilityNodeInfo.ACTION_FOCUS) editText?.performAction(AccessibilityNodeInfo.ACTION_PASTE) } else { editText?.text = ClipboardUtil.getPrimaryClip(this) }
自動選圖
使用者點選分享時下載並記錄圖片,如果使用者打開了無障礙服務,服務將代替使用者自動選擇圖片,否則使用者也可以進入相簿手動選擇圖片。
// 以下幾個步驟是非同步的,這裡只是為了方便才寫在了一起。 // 第一步: 自動點選新增圖片的 + 號按鈕。 val gridView = findNodeInfo(rootInActiveWindow, GridView::class.java.name) gridView?.getChild(gridView.childCount - 1)?.performAction(AccessibilityNodeInfo.ACTION_CLICK) // 第二步:點選【從相簿選擇】按鈕。 listView.findAccessibilityNodeInfosByText("從相簿選擇") ?.get(0) ?.parent ?.performAction(AccessibilityNodeInfo.ACTION_CLICK) // 第三步:選擇圖片。 val gridView = findNodeInfo(rootInActiveWindow, GridView::class.java.name) for (i in ShareInfo.getSelectedImageCount()..ShareInfo.getWaitingImageCount()) { findNodeInfo(gridView.getChild(i), View::class.java.name) ?.performAction(AccessibilityNodeInfo.ACTION_CLICK) } // 第四步:點選【完成】按鈕。 rootInActiveWindow.findAccessibilityNodeInfosByText("完成") ?.get(0) ?.performAction(AccessibilityNodeInfo.ACTION_CLICK)
詳細內容請 檢視原始碼 。
為了方便大家使用新的分享方案,我這裡已經封裝成元件 ,併發布原始碼到 Github。
https://github.com/shichaohui/WXShareMultiImage完整的多圖分享流程

流程圖
檢視演示視訊
優缺點
優點
- 可自動貼上分享文字。
- 可自動選擇指定的多張圖片。
- 服務不可用時會自動降級,由使用者手動選擇圖片。
缺點
- 無法獲取分享結果。
- 需使用者手動開啟服務。
- 部分機型在關閉APP時會自動關閉服務。
- 微信更新朋友圈圖文分享介面可能導致方案失效。