正文
起因来源于一次需求:
-
同时分享文字,图片到微信朋友圈
-
同时分享文字,多张图片到微信朋友圈
-
分享小视频到微信朋友圈
本身觉得是一件简单的事情,正常的一个场景,然而开始实现时,遇坑无数,则开始骂爹骂娘。因为这么正常的一个场景,微信官方竟然不支持。最最重要的是产品拿了样品app,人家确实做到了。
微信分享sdk文档
需求1:同时分享文字,图片到微信朋友圈
首先分析,要做到图文并茂分享到微信朋友圈肯定不是通过微信的分享sdk进行页面跳转的,我们可以试试Intent的形式直接跳转
public static final void shareImagesToWechatCircleWithActionSend(@NonNull Context paramContext, @NonNull Uri paramUri, @NonNull String paramString) {
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.tencent.mm", "com.tencent.mm.ui.tools.ShareToTimeLineUI"));
intent.setType("image/*");
intent.setAction("android.intent.action.SEND");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("android.intent.extra.STREAM", (Parcelable)paramUri);
intent.putExtra("Kdescription", paramString);
intent.putExtra("android.intent.extra.TEXT", paramString);
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
paramContext.startActivity(intent);
}
paramUri:本地图片的uri
paramString:文本数据
可以发现通过该方式可以直接满足需求1的要求,截图如下:
需求2:同时分享文字,多张图片到微信朋友圈
这个查阅了很多资料和参考了样品app,确实微信7.0版本之后无法实现一次性分享多张图片到微信朋友圈,7.0之前的可以这里不做说明。而样品app则采用的是辅助功能,下载图片到相册,自动点击+号按钮帮用户自动选取九宫格来变相的实现此需求。于是乎,功能照搬。
脑路模拟:下载图片到相册 —> 进入到微信的分享页面 -> 找到+号按钮,点击 —> 找到弹窗,选中从相册选择 —> 进入到相册页面后,自动帮忙选中前9中图片 —> 最后点击右上角完成 —> 大功告成!!!
!!!万事起源于+号按钮!!!
细心的同学会发现,不论是通过微信分享sdk的方式还是直接intent跳转的方式,进入到微信的朋友圈分享页面是不会显示后面的+号上传按钮的,只有微信用户从朋友圈入口进来才会显示,如图:
这就涉及到了我的知识盲区了啊,通过adb shell sysdump activity | grep -i run 各种技巧最后发现样品app分享到的微信朋友圈页面的activity和我们先前写的完全不一样,最后总结出一下两个函数供大家使用
/**
* 微信7.0之前的分享页面,可以显示+号按钮,同时支持图片,文字混合
* @param context
* @param paramUri
* @param paramString
*/
public static final void shareImagesToWechatCircleWithActionView(@NonNull Context context,@NonNull Uri paramUri, @NonNull String paramString) {
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.tencent.mm", "com.tencent.mm.ui.tools.ShareScreenToTimeLineUI"));
intent.setAction("android.intent.action.VIEW");
intent.setDataAndType(paramUri, "image/*");
intent.putExtra("Kdescription", paramString);
intent.putExtra("android.intent.extra.TEXT", paramString);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
context.startActivity(intent);
}
/**
* 微信7.0版本之后的分享页面,无法显示+号,支持图片,文字混合
* @param paramContext
* @param paramUri
* @param paramString
*/
public static final void shareImagesToWechatCircleWithActionSend(@NonNull Context paramContext, @NonNull Uri paramUri, @NonNull String paramString) {
Intent intent = new Intent();
intent.setComponent(new ComponentName(WechatConstant.wechatPackageName, WechatConstant.sahreToTimeLineUiClassName));
intent.setType("image/*");
intent.setAction("android.intent.action.SEND");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("android.intent.extra.STREAM", (Parcelable)paramUri);
intent.putExtra("Kdescription", paramString);
intent.putExtra("android.intent.extra.TEXT", paramString);
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
paramContext.startActivity(intent);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
万恶的+号问题终于显示出来,上边的脑路模拟就可以编码实现了。
需求3:分享小视频到微信朋友圈
通过微信分享sdk分享出来的小视频是一个链接形式,用户点击该链接后则跳转开始播放网页视频,而产品需要的是视频流卡片形式。样品app没有实现视频的分享功能,最后确定下来方案是先下载短视频到本地,通过辅助功能自动帮助用户选择短视频。
脑路模拟:下载短视频到相册 —> 进入到微信的分享页面 -> 找到+号按钮,点击 —> 找到弹窗,选中从相册选择 —> 进入到相册页面后,点击顶部的所有视频分类 —> 自动帮忙选中前1个短视频 —> 最后点击右上角完成 —> 大功告成!!!
!!!又是万恶的+号!!!
通过测试发现,如果已经选中了一张图片,往后点击+号只能继续选择图片,无法选中视频。只有把选中的图片都移除掉,才可以选择短视频。
问题二,想要来到微信朋友圈的分享页面,必须要传入imageUri,否则会报错,资源无法加载。
最后采用的方案,是携带一张默认图片,先来到微信朋友圈的分享页面,后通过辅助功能将该张图片移除,最后点击+号开始选中短视频。