Android调用微信分享的方式:

  1. 最为正规的方式当然是使用微信的sdk进行调起微信的分享。但是可恶的目前微信的sdk版本暂时是不支持分享多张图片的
  2. 使用第三方封装的分享的SDK。例如:ShareSDK,友盟的社会化分享等等。
  3. Android下可以直接使用系统的分享,直接调用微信的分享朋友圈的Activity,通过Intent进行传递数据。这种方式其实是因为微信实现了Android系统分享的Intent Action的规则(这一点可以将微信进行反编译来进行验证)注意:这种方式只能在Android上来实现,在ios系统下其实是无法实现的

Sample

实现的Sample我已经放到了GitHub上,有兴趣以及有这方面需求的可以去看一下。
地址如下:https://github.com/JeffWangGithub/TestWXMultiShare

具体实现思路

1. 微信默认情况下实现了Android系统的分享的Intent Action规则。因此我们可以反编译微信,找到多张图片分享界面对应的Activity, 此Activity正好实现了两个规则。因此我们可以直接调用此Activity将数据传递给它,达到分享的目的。
2. 自动传递描述信息,这就需要将其对应的来,找到如何通过Intent传递描述信息了。

微信的反编译代码解析

  1. 清单文件代码,查看实现的Intent规则

    从清单文件中可以看出分享多张图片的类ShareToTimeLineUI,实现了系统的两个分享规则,因此我们可以通过Activity的隐式调用调起此Activity
  2. 查看此类传递的描述文案能否通过Intent将其传递

    微信的代码已经做了代码混淆,因此看起来有些痛快,但是仔细观察还是有很多东西可以看出来的。在此类中我们寻找Intent传递的有关key的名称,好到了好几个,因此我们可以一个个来测试,最终发现就是Kdescription这个键来传递描述信息
1
2
3
4
5
6
7
8
9
10
11
12
13
public void shareToFriendsCircle(Context context,String Kdescription,String... paths) {
Intent intent = new Intent();
intent.setComponent(new ComponentName(ConstantsAPI.WXApp.WXAPP_PACKAGE_NAME, "com.tencent.mm.ui.tools.ShareToTimeLineUI"));
intent.setAction("android.intent.action.SEND_MULTIPLE");
ArrayList<CharSequence> imagePathList = new ArrayList<CharSequence>();
for(String picPath: paths){
imagePathList.add(picPath);
}
intent.putCharSequenceArrayListExtra(Intent.EXTRA_STREAM,imagePathList); //图片数据(支持本地图片的Uri形式)
intent.setType("image/*");
intent.putExtra("Kdescription", Kdescription); //微信分享页面,图片上边的描述
context.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
37
38
public class MyActivity extends Activity implements View.OnClickListener{

private File[] files;
private String[] paths;

/**
* Called when the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

// 遍历 SD 卡下 .png 文件通过微信分享,保证SD卡根目录下有.png的文件
File root = Environment.getExternalStorageDirectory();
files = root.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
if (pathname.getName().endsWith(".jpg"))
return true;
return false;
}
});
}

@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.share_btn1:
if(files == null || files.length == 0){
Toast.makeText(this,"SD卡根目录下无.png格式照片",Toast.LENGTH_SHORT).show();
}else{
ShareUtils.shareMultiPicToWXCircle(this, "你好,成功的分享了多张照片到微信",files);
}
break;
}
}
}