微信多图片分享

2017-05-11  本文已影响248人  小鱼爱记录

Demo下载地址:MultiShare

注意点

  1. 这里直接调用系统的分享,跳转微信的Activity,无须微信SDK
  2. 系统的分享只能分享本地图片,所以需要下载
  3. 难点在于开启多个线程分别下载图片后,如何知道都下载完毕了并一起分享?
  4. 下载图片这里依赖了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;
    }

}

上一篇下一篇

猜你喜欢

热点阅读