无法分享到微信,系统分享接口暂不支持分享多图至朋友圈。
2018年09月29日,微信更新之后多图分享不行了,立马拿起手机更新微信,果然是有 v6.7.3 的新版本,更新完成之后打开之前的多图分享功能,便出现了上面图片的一幕。(依赖别人的东西,就得被别人牵着鼻子走)
没办法,多图分享的功能不能丢,这个问题就必须得解决,而且刻不容缓,开始找原因,到底是微信接收图片的方法变了,还是根本不再允许多图了?
首先看看v6.7.3版本之前的多图分享是怎么处理的:(图片来自网络)
不难发现,v6.7.3版本之前的微信在取出intent里面的图片url后会把这些url转换为一个ArrayList, 然后只是判断了一下这个ArrayList是不是空,不为空的话就去分享了。
咱们再来看看v6.7.3版本变成什么样子了:(图片来自网络)
这次咱们看到取出intent里面图片的ArrayList.size()大于1,就显示上面那个“无法分享到微信”的界面”,这样看来微信是彻底不让咱们走多图分享这条路了,以前的方式只能分享一张图片。
接下来咱们开始想想解决方案,辗转发现手机更多设置或者高级设置中,有个无障碍的功能,很多人不知道这个功能具体是干嘛的,其实这个功能是为了增强用户界面以帮助残障人士,或者可能暂时无法与设备充分交互的人们。
想法就是通过这个无障碍的功能,实现自动粘贴文字,自动选择图片并发布朋友圈。好了,既然咱们有了思路,就开始撸起袖子开始干吧,关于无障碍服务(AccessibilityService)的介绍和用法网上有很多,这里就不多作介绍了,小伙伴们有不了解的自己找度娘去吧。
通过使用无障碍服务,可以监听用户手机界面和事件,并在特定事件产生时代替用户执行一些操作。因此我们只要知道分析朋友圈图文分享界面的事件,找到合适的事件帮助用户自动填写文字、自动选择图片即可。
注意:由于无障碍服务功能强大,因此 Android 系统对其进行了限制,必须用户手动打开 APP 开发的无障碍服务,才能产生作用。
AccessibilityService的回调事件分析:
public class WXShareMultiImagesService extends AccessibilityService {
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
// 当窗口发生的事件是我们配置监听的事件时,会回调此方法.会被调用多次
}
@Override
public void 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)
// 查找指定类名的节点。
private AccessibilityNodeInfo findNodeInfo(AccessibilityNodeInfo rootNodeInfo, String className) {
}
微信每个版本的视图 id 都不一样,为了版本兼容,不能使用 id 获取节点。
通过 text 文本获取节点只对有 text 属性且有值的节点有效。
因此大多数节点通过遍历子节点的形式获取。
自动粘贴
将待分享的文字复制到系统剪切板,如果用户打开了无障碍服务,服务将自动粘贴文字到输入框,否则用户也可以手动长按输入框粘贴。
// 设置待分享文字。
AccessibilityNodeInfo editText = findNodeInfo(rootNodeInfo,EditText.class.getName());
// 粘贴剪切板内容
if (editText != null) {
editText.performAction(AccessibilityNodeInfo.ACTION_FOCUS);
editText.performAction(AccessibilityNodeInfo.ACTION_PASTE);
}
自动选图
用户点击分享时下载并记录图片,如果用户打开了无障碍服务,服务将代替用户自动选择图片,否则用户也可以进入相册手动选择图片。
// 第一步: 自动点击添加图片的 + 号按钮。
AccessibilityNodeInfo gridView = findNodeInfo(rootNodeInfo, GridView.class.getName());
if (gridView != null && gridView.getChildCount() > 0) {
gridView.getChild(gridView.getChildCount() -1).performAction(AccessibilityNodeInfo.ACTION_CLICK);
}
// 第二步:点击【从相册选择】按钮。
AccessibilityNodeInfo listView = event.getSource();
if (listView != null && listView.getChildCount() > 0) {
listView.getChild(listView.getChildCount() - 1).performAction(AccessibilityNodeInfo.ACTION_CLICK);
}
// 第三步:选择图片。
AccessibilityNodeInfo gridView = findNodeInfo(rootNodeInfo, GridView.class.getName());
if (gridView == null) {
return;
}
for (int i = 1; i <= imgCount; i++) {//从下标为1的图片开始选择
AccessibilityNodeInfo viewNode = findNodeInfo(gridView.getChild(i), View.class.getName());
if (viewNode != null) {
viewNode.performAction(AccessibilityNodeInfo.ACTION_CLICK);
}
}
// 第四步:点击【完成】按钮。
List<AccessibilityNodeInfo> doneNodeList = rootNodeInfo.findAccessibilityNodeInfosByText("完成");
if (doneNodeList.isEmpty()) {
doneNodeList = rootNodeInfo.findAccessibilityNodeInfosByText("Done");
}
if (!doneNodeList.isEmpty()) {
doneNodeList.get(0).performAction(AccessibilityNodeInfo.ACTION_CLICK);
}
注意:在使用无障碍自多图分享图片到朋友圈之前,需要把待分享的图片下载到本地。
完整的多图分享流程(图片来自网络)
优缺点
优点
- 可自动粘贴分享文字。
- 可自动选择指定的多张图片。
- 服务不可用时会自动降级,由用户手动选择图片。
缺点
- 无法获取分享结果。
- 需用户手动打开服务。
- 部分机型在关闭APP时会自动关闭服务。
- 微信更新朋友圈图文分享界面可能导致方案失效。
此文章通过各方收集资料整理而来,如有侵权,请联系删除。
特别鸣谢:StoneHui
没有英汉互译结果
请尝试网页搜索