Demo下载地址:MultiShare
注意点
- 这里直接调用系统的分享,跳转微信的Activity,无须微信SDK
- 系统的分享只能分享本地图片,所以需要下载
- 难点在于开启多个线程分别下载图片后,如何知道都下载完毕了并一起分享?
- 下载图片这里依赖了RxJava和RxAndroid,用到了zip操作符
效果图

代码
package com.soubu.multishare;
import android.app.ProgressDialog;
import android.content.ComponentName;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import rx.Observable;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action0;
import rx.functions.Func1;
import rx.functions.FuncN;
import rx.schedulers.Schedulers;
public class MainActivity extends AppCompatActivity {
private ProgressDialog progressDialog;
private String title;
private String link;
private List<String> urls;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
progressDialog = new ProgressDialog(this);
progressDialog.setMessage("正在准备分享……");
title = "热门商品";
link = "https://www.baidu.com";
urls = new ArrayList<>();
urls.add("http://img.tuku.cn/file_thumb/201502/m2015022418482374.jpg");
urls.add("http://img.tuku.cn/file_thumb/201502/m2015022418483246.jpg");
urls.add("http://img.tuku.cn/file_thumb/201502/m2015022418483910.jpg");
urls.add("http://img.tuku.cn/file_thumb/201502/m2015022418484513.jpg");
urls.add("http://img.tuku.cn/file_thumb/201502/m2015022418485402.jpg");
urls.add("http://img.tuku.cn/file_thumb/201502/m2015022418490254.jpg");
urls.add("http://img.tuku.cn/file_thumb/201502/m2015022418490977.jpg");
urls.add("http://img.tuku.cn/file_thumb/201502/m2015022418491576.jpg");
urls.add("http://img.tuku.cn/file_thumb/201502/m2015022418492229.jpg");
findViewById(R.id.tv_share).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
multiShare(title, link, urls);
}
});
}
/**
* 分享多张图片到朋友圈
*
* @param title
* @param link
* @param urls
*/
private void multiShare(final String title, final String link, List<String> urls) {
List<Observable<Uri>> observables = new ArrayList<>();
for (String url : urls) {
Observable<Uri> subObservable = Observable.just(url)
.map(new Func1<String, Uri>() {
@Override
public Uri call(String s) {
try {
Bitmap bitmap = loadBitmap(s);
File file = bitmapToFile(bitmap);
return Uri.fromFile(file);
} catch (Exception e) {
throw new RuntimeException("下载图片故障", e);
}
}
});
observables.add(subObservable);
}
Observable.zip(observables, new FuncN<ArrayList<Uri>>() {
@Override
public ArrayList<Uri> call(Object... args) {
ArrayList<Uri> uriList = new ArrayList<Uri>();
for (Object arg : args) {
uriList.add((Uri) arg);
}
return uriList;
}
})
.subscribeOn(Schedulers.io())
.doOnSubscribe(new Action0() {
@Override
public void call() {
progressDialog.show();
}
})
.subscribeOn(AndroidSchedulers.mainThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<ArrayList<Uri>>() {
@Override
public void onCompleted() {
progressDialog.dismiss();
}
@Override
public void onError(Throwable e) {
progressDialog.dismiss();
e.printStackTrace();
}
@Override
public void onNext(ArrayList<Uri> uris) {
shareToFriendsCircle(title, link, uris);
}
});
}
/**
* 直接调用系统的微信分享,不用sdk
*
* @param title
* @param link
* @param uris
*/
public void shareToFriendsCircle(String title, String link, ArrayList<Uri> uris) {
Intent shareIntent = new Intent();
ComponentName component = new ComponentName("com.tencent.mm", "com.tencent.mm.ui.tools.ShareToTimeLineUI");
shareIntent.setComponent(component);
shareIntent.setAction(Intent.ACTION_SEND_MULTIPLE);
shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
shareIntent.setType("image/*");
shareIntent.putExtra("Kdescription", String.format("%s %s", title, link));
startActivity(Intent.createChooser(shareIntent, "分享"));
}
/**
* 下载图片
*
* @param url
* @return
* @throws Exception
*/
public Bitmap loadBitmap(String url) throws Exception {
URL fileUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection) fileUrl.openConnection();
conn.setDoInput(true);
conn.connect();
InputStream is = conn.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(is);
is.close();
conn.disconnect();
return bitmap;
}
/**
* 保存图片到文件
*
* @param bitmap
* @return
* @throws Exception
*/
public File bitmapToFile(Bitmap bitmap) throws Exception {
File file = createFile();
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);
bos.flush();
bos.close();
return file;
}
/**
* 创建文件
*
* @return
* @throws Exception
*/
public File createFile() throws Exception {
String name = System.currentTimeMillis() + ".png";
File dir = getExternalCacheDir();
File file = new File(dir, name);
return file;
}
}
网友评论