美文网首页
微信多图片分享

微信多图片分享

作者: 小鱼爱记录 | 来源:发表于2017-05-11 20:17 被阅读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;
        }
    
    }
    
    

    相关文章

      网友评论

        本文标题:微信多图片分享

        本文链接:https://www.haomeiwen.com/subject/cykatxtx.html