Android一键转发图片多张图片到微信,朋友圈功能实现

效果图Android一键转发图片多张图片到微信,朋友圈功能实现_第1张图片Android一键转发图片多张图片到微信,朋友圈功能实现_第2张图片Android一键转发图片多张图片到微信,朋友圈功能实现_第3张图片

一键转发按钮,直接把多张图片拉起朋友圈,自动填充图片,或者多张图片发给好友,文字可以复制过去直接粘贴,

实现思路:

1.先把接口请求下来的多张图片保存到本地,这里是用Glide做的本地缓存

 

//缓存图片到本地
for (int i = 0; i < images.size(); i++) {
    Glide.with(this)
            .load(images.get(i).getPic_url()).asBitmap().into(new SimpleTarget() {
        @Override
        public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) {
            ImgFileUtils.saveBitmap(PosterXQActivity.this, resource, StringUtils.setDateTime());
        }
    });
}
/**工具类代码  * author:zhengfeng on 2017/8/21 10:13  */ 
public class ImgFileUtils { 
/**  * 生成文件夹路径  */
  public static String SDPATH = Environment.getExternalStorageDirectory() + "/WS_IMG/"; 
  public static void saveImageToGallery(Context context, Bitmap bmp) {
  // 首先保存图片 
  File appDir = new File(Environment.getExternalStorageDirectory(), "/WS_IMG/"); 
      if (!appDir.exists()) { appDir.mkdir();  } String fileName = System.currentTimeMillis() + ".jpg";
      File file = new File(appDir, fileName); 
      try {
      FileOutputStream fos = new FileOutputStream(file);
      bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos);
      fos.flush(); 
      fos.close();
  } catch (FileNotFoundException e) { 
    e.printStackTrace();
  } catch (IOException e) {
    e.printStackTrace();
    } // 其次把文件插入到系统图库 
    try { MediaStore.Images.Media.insertImage(context.getContentResolver(),  file.getAbsolutePath(), fileName, null);
    } catch (FileNotFoundException e) { e.printStackTrace(); 
    } // 最后通知图库更新  //
    context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + path)));
    } 
    /**  
    * 将图片压缩保存到文件夹  * 
    * @param bm 
    * @param picName 
    */ 
    
    public static void saveBitmap(Context context,Bitmap bm, String picName) {
        try {
        // 如果没有文件夹就创建一个程序文件夹 
        if (!isFileExist("")) { 
            File tempf = createSDDir("");
        } File f = new File(SDPATH, picName + ".JPEG");
        Log.e("filepath",f.getAbsolutePath()); 
        PosterXQImgCache.getInstance().setImgCache(f.getAbsolutePath());//缓存保存后的图片路径 
        // 如果该文件夹中有同名的文件,就先删除掉原文件 
        if (f.exists()) { f.delete();
        } 
        FileOutputStream out = new FileOutputStream(f);
        bm.compress(Bitmap.CompressFormat.JPEG, 90, out); 
        out.flush(); 
        out.close(); 
        Log.e("imgfile", "已经保存"); 
        //保存图片后发送广播通知更新数据库 
        Uri uri = Uri.fromFile(f); 
        context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
            } 
        } 
            /**  
            * 质量压缩 并返回Bitmap  *
            * @param image  
            * 要压缩的图片 
            * @return 压缩后的图片 
            */  private Bitmap compressImage(Bitmap image) {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            image.compress(Bitmap.CompressFormat.JPEG, 100, baos);
            // 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中  
            int options = 100;
            while (baos.toByteArray().length / 1024 > 100) {
            // 循环判断如果压缩后图片是否大于100kb,大于继续压缩  
            baos.reset();
            // 重置baos即清空baos 
            image.compress(Bitmap.CompressFormat.JPEG, options, baos);
            // 这里压缩options%,把压缩后的数据存放到baos中 
            options -= 10;
            // 每次都减少10 
            } 
            ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());
            // 把压缩后的数据baos存放到ByteArrayInputStream中 
            Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);
            // 把ByteArrayInputStream数据生成图片  return bitmap; 
            } 
            /**  
            * 质量压缩  
            *  
            * @param bitmap  
            * @param picName 
            */  
            public static void compressImageByQuality(final Bitmap bitmap,  String picName) { 
            // 如果没有文件夹就创建一个程序文件夹 
            if (!isFileExist("")) { 
                try { 
                    File tempf = createSDDir("");
                } catch (IOException e) {
                // TODO Auto-generated catch block  
                    e.printStackTrace();
                    } 
                }
                File f = new File(SDPATH, picName + ".JPEG"); 
                // 如果该文件夹中有同名的文件,就先删除掉原文件
                if (f.exists()) { 
                    f.delete();
                } 
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                int options = 100;
                // 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中 
                bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos); 
                // 循环判断如果压缩后图片是否大于200kb,大于继续压缩 
                while (baos.toByteArray().length / 1024 > 500) { 
                // 重置baos即让下一次的写入覆盖之前的内容  baos.reset(); 
                // 图片质量每次减少5  options -= 5;  
                // 如果图片质量小于10,则将图片的质量压缩到最小值 
                if (options < 0) options = 0;  
                // 将压缩后的图片保存到baos中  b
                itmap.compress(Bitmap.CompressFormat.JPEG, options, baos); 
                // 如果图片的质量已降到最低则,不再进行压缩  
                if (options == 0) break;
                }
                // 将压缩后的图片保存的本地上指定路径中  
                FileOutputStream fos; 
                    try { 
                    fos = new FileOutputStream(new File(SDPATH, picName + ".JPEG")); 
                    fos.write(baos.toByteArray());  
                    fos.flush(); 
                    fos.close(); 
                    } catch (
                    FileNotFoundException e) {
                    e.printStackTrace();
                    } catch (IOException e) { 
                    e.printStackTrace();
                    }
                } 
                /**  
                * 创建文件夹  *
                * @param dirName  
                * 文件夹名称  
                * @return 文件夹路径  
                * @throws IOException  
                */  
                public static File createSDDir(String dirName) throws IOException {
                    File dir = new File(SDPATH + dirName);
                    if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) {
                        System.out.println("createSDDir:" + dir.getAbsolutePath()); 
                        System.out.println("createSDDir:" + dir.mkdir()); 
                        } return dir; 
                } 
                /** 
                * 判断改文件是否是一个标准文件  *
                * @param fileName  
                * 判断的文件路径  
                * @return 判断结果  
                */  
                public static boolean isFileExist(String fileName) {
                    File file = new File(SDPATH + fileName); 
                    file.isFile(); 
                    return file.exists(); 
                } 
                /** 
                * 删除指定文件  *
                * @param fileName  
                */  
                public static void delFile(String fileName) { 
                    File file = new File(SDPATH + fileName); 
                    if (file.isFile()) { 
                        file.delete(); 
                        } 
                    file.exists(); 
                } 
                /**  
                * 删除指定文件  
                * @param file 
                */  
                public static void deleteFile(File file) { 
                    if (file.exists()) { 
                    // 判断文件是否存在 
                    if (file.isFile()) { 
                    // 判断是否是文件  
                    file.delete(); 
                    // delete()方法 你应该知道 是删除的意思;
                    } else if (file.isDirectory()) {
                    // 否则如果它是一个目录 
                    File files[] = file.listFiles();
                    // 声明目录下所有的文件 files[]; 
                    for (int i = 0; i < files.length; i++) {
                    // 遍历目录下所有的文件  
                    deleteFile(files[i]); 
                    // 把每个文件 用这个方法进行迭代 
                    } 
                    } 
                    file.delete(); 
                } else { 
                    Log.i("TAG", "文件不存在!");
                    } 
                } 
                /**  
                * 删除指定文件夹中的所有文件  
                */  
                public static void deleteDir() { 
                    File dir = new File(SDPATH);  
                    if (dir == null || !dir.exists() || !dir.isDirectory()) return;  
                        for (File file : dir.listFiles()) {
                        if (file.isFile()) file.delete(); 
                        else if (file.isDirectory()) deleteDir(); 
                    } 
                    dir.delete();  
                } 
                /**  
                * 判断是否存在该文件  *
                * @param path  * 文件路径  
                * @return  
                */  
                public static boolean fileIsExists(String path) { 
                    try { 
                        File f = new File(path);
                        if (!f.exists()) { 
                            return false; 
                        } 
                    } catch (Exception e) { 
                            return false; 
                        } 
                        return true; 
                    } 
                }

 

2.缓存图片的同时把图片路径做一个缓存,为了拉起朋友圈直接带过去多张图片路径

 

 

public class PosterXQImgCache {

    private List imgCache = new ArrayList<>();//用于存放保存后的图片路径
    private static final PosterXQImgCache instance = new PosterXQImgCache();


    public static PosterXQImgCache getInstance() {
        return instance;
    }

    public List getImgCache() {
        return imgCache;
    }

    public void setImgCache(String path) {//传入保存后的图片绝对路径
        imgCache.add(path);
    }

    public void removeImgCache() {//清空缓存
        imgCache.clear();
    }
}

3,一键转发点击事件,直接拿到缓存后的图片路径集合,以Uri数组的形式传入多张图片文件

 

 

case R.id.one_tranmit://一键转发
    imgCache = PosterXQImgCache.getInstance().getImgCache();
    Uri[] uris = new Uri[imgCache.size()];//创建用于存放图片的Uri数组
    //循环缓存路径分别生成文件,添加到图片Uri数组中
    for (int i = 0; i < imgCache.size(); i++) {
        uris[i] = Uri.fromFile(new File(imgCache.get(i)));
    }

    requestCopy(text);//复制文字内容到粘贴板
    //调用转发微信功能类
    shareUtils = new ShareUtils(this, text);
    shareUtils.setUri(uris);

    break;
 
/**分享多图到微信或者朋友圈*/

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.PopupWindow;
import android.widget.Toast;

import com.example.common_lib.R;
import com.ss.sszb.SszbApp;
import com.ss.sszb.activity.PersonalInformationActivity;
import com.ss.sszb.dialog.ChooseShareTypeDialog;
import com.ss.sszb.dialog.ChooseShareWxImgDialog;
import com.umeng.socialize.ShareAction;
import com.umeng.socialize.UMShareAPI;
import com.umeng.socialize.bean.SHARE_MEDIA;
import com.umeng.socialize.media.UMImage;
import com.umeng.socialize.media.UMWeb;
import com.zd.mvp.common.util.StringUtils;

import java.io.File;
import java.util.ArrayList;

/**分享多图到微信或者朋友圈工具类*/

public class ShareUtils {

    /**
     * 微信7.0版本号,兼容处理微信7.0版本分享到朋友圈不支持多图片的问题
     */
    private static final int VERSION_CODE_FOR_WEI_XIN_VER7 = 1380;
    /**
     * 微信包名
     */
    public static final String PACKAGE_NAME_WEI_XIN = "com.tencent.mm";

    PopupWindow popupWindow;
    Context context;
    private String path;//单张图片路径
    private String content;
    private Button btn;
    private Uri[] uris;//多张图片路径uri数组
    public ShareUtils(Context context){
        this.context=context;
        //  this.path=path;
      //  this.content=content;

        //  this.btn=btn;

        showChosePayTypeDialog();
    }

    public void setUri(Uri[] uris){
        this.uris = uris;
    }

    public void setPath(String path){
        this.path = path;
    }

    /**选择分享方式弹窗*/
    ChooseShareWxImgDialog chooseShareTypeDialog;
    public void showChosePayTypeDialog() {

        if (chooseShareTypeDialog == null) {
            chooseShareTypeDialog = new ChooseShareWxImgDialog(context);
        }

        chooseShareTypeDialog.show();


        chooseShareTypeDialog.setChoseTypeListener(new ChooseShareWxImgDialog.setChoseTypeListener() {
            @Override
            public void onChoseType(int type) {
                if (type == 1){//微信
                    if (SszbApp.isWeixinAvilible(context)) {
                        shareWXSomeImg(context,uris);
                    } else {
                        Toast.makeText(context, "请先安装微信", Toast.LENGTH_SHORT).show();
                    }

                } else if (type == 2) {//朋友圈
                    if (SszbApp.isWeixinAvilible(context)) {
                        shareweipyqSomeImg(context,uris);//拉起微信朋友圈带多张图片
                    } else {
                        Toast.makeText(context, "请先安装微信", Toast.LENGTH_SHORT).show();
                    }
                }
            }
        });
    }

//    private void showpop() {
//        View view= LayoutInflater.from(context).inflate(
//                R.layout.share_view, null);
//        ImageView img_weixin= (ImageView) view.findViewById(R.id.share_weixin);
//        ImageView img_pyq= (ImageView) view.findViewById(R.id.share_pengyouquan);
//        popupWindow = new PopupWindow(view, ViewGroup.LayoutParams.MATCH_PARENT,
//                ViewGroup.LayoutParams.WRAP_CONTENT, true);
//        popupWindow.setBackgroundDrawable(new BitmapDrawable()); // 点击返回按钮popwindow消失
//
//        img_weixin.setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View v) {
//                if (StringUtils.isWeixinAvilible(context)) {// 判断是否安装微信客户端
//                    // shareweixin(path);
//                    shareWXSomeImg(context,uris);
//                    // login(SHARE_MEDIA.WEIXIN);
//                } else {
//                    ActivityUtil.showToast(context, "请安装微信客户端");
//                }
//
//                popupWindow.dismiss();
//            }
//        });
//        img_pyq.setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View v) {
//
//                if (StringUtils.isWeixinAvilible(context)) {// 判断是否安装微信客户端
//                    //   shareweipyq(path,content);//拉起微信朋友圈带一张图片
//                    shareweipyqSomeImg(context,uris);//拉起微信朋友圈带多张图片
//                    // login(SHARE_MEDIA.WEIXIN);
//                } else {
//                    ActivityUtil.showToast(context, "请安装微信客户端");
//                }
//                popupWindow.dismiss();
//            }
//        });
//
//        popupWindow.showAtLocation( LayoutInflater.from(context).inflate(
//                R.layout.activity_posterxq, null).findViewById(R.id.img_share), Gravity.BOTTOM, 0, 0);// 先设置popwindow的所有参数,最后再show
//
//    }

    /**
     * 拉起微信好友发送单张图片
     * */
    private void shareweixin(String path){
        Uri uriToImage = Uri.fromFile(new File(path));
        Intent shareIntent = new Intent();
        //发送图片到朋友圈
        //ComponentName comp = new ComponentName("com.tencent.mm", "com.tencent.mm.ui.tools.ShareToTimeLineUI");
        //发送图片给好友。
        ComponentName comp = new ComponentName("com.tencent.mm", "com.tencent.mm.ui.tools.ShareImgUI");
        shareIntent.setComponent(comp);
        shareIntent.setAction(Intent.ACTION_SEND);
        shareIntent.putExtra(Intent.EXTRA_STREAM, uriToImage);
        shareIntent.setType("image/jpeg");
        context.startActivity(Intent.createChooser(shareIntent, "分享图片"));
    }
    /**
     * 拉起微信朋友圈发送单张图片
     * */
    private void shareweipyq(String path,String content){
        Uri uriToImage = Uri.fromFile(new File(path));
        Intent shareIntent = new Intent();
        //发送图片到朋友圈
        ComponentName comp = new ComponentName("com.tencent.mm", "com.tencent.mm.ui.tools.ShareToTimeLineUI");
        //发送图片给好友。
//        ComponentName comp = new ComponentName("com.tencent.mm", "com.tencent.mm.ui.tools.ShareImgUI");
        shareIntent.setComponent(comp);
        shareIntent.putExtra("Kdescription", content);
        shareIntent.setAction(Intent.ACTION_SEND);
        shareIntent.putExtra(Intent.EXTRA_STREAM, uriToImage);
        shareIntent.setType("image/jpeg");
        context.startActivity(Intent.createChooser(shareIntent, "分享图片"));
    }

    /**
     * 拉起微信朋友圈发送多张图片
     * */
    private void shareweipyqSomeImg(Context context,Uri[] uri){
        Intent shareIntent = new Intent();
        //1调用系统分享
       // shareIntent.setAction(Intent.ACTION_SEND_MULTIPLE);
        shareIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        //2添加图片数组
        ArrayList imageUris = new ArrayList<>();
        for (int i = 0; i < uri.length; i++) {
            imageUris.add(uri[i]);
            Log.e("shareIntent",uri[i]+"路径");
        }

        if (getVersionCode(context,PACKAGE_NAME_WEI_XIN) < VERSION_CODE_FOR_WEI_XIN_VER7) {
            // 微信7.0以下版本
            shareIntent.setAction(Intent.ACTION_SEND_MULTIPLE);
            shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM,imageUris);
        } else {
            // 微信7.0及以上版本,朋友圈只支持单张图片分享
            shareIntent.setAction(Intent.ACTION_SEND);
            shareIntent.putExtra(Intent.EXTRA_STREAM,uri[0]);
        }

        shareIntent.setType("image/*");

        //3指定选择微信
        ComponentName componentName = new ComponentName("com.tencent.mm","com.tencent.mm.ui.tools.ShareToTimeLineUI");
        shareIntent.setComponent(componentName);

        //4开始分享
        context.startActivity(Intent.createChooser(shareIntent,"分享图片"));
    }

    /**
     * 拉起微信发送多张图片给好友
     * */
    private void shareWXSomeImg(Context context,Uri[] uri){
        Intent shareIntent = new Intent();
        //1调用系统分析
        shareIntent.setAction(Intent.ACTION_SEND_MULTIPLE);
        shareIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        //2添加图片数组
        ArrayList imageUris = new ArrayList<>();
        for (int i = 0; i < uri.length; i++) {
            imageUris.add(uri[i]);
        }

        shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM,imageUris);
        shareIntent.setType("image/*");

        //3指定选择微信
        ComponentName componentName = new ComponentName("com.tencent.mm","com.tencent.mm.ui.tools.ShareImgUI");
        shareIntent.setComponent(componentName);

        //4开始分享
        context.startActivity(Intent.createChooser(shareIntent,"分享图片"));
    }

    /**
     * 获取制定包名应用的版本的versionCode
     * @param context
     * @param
     * @return
     */
    public static int getVersionCode(Context context,String packageName) {
        try {
            PackageManager manager = context.getPackageManager();
            PackageInfo info = manager.getPackageInfo(packageName, 0);
            int version = info.versionCode;
            return version;
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }

}

//弹窗dialog代码

package com.ss.sszb.dialog;

import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.ss.sszb.R;

/**
 * @autor: zf
 * @Description: 选择分享多张图片到微信-朋友圈方式
 * @Date: 2019/1/23 12:18
 */
public class ChooseShareWxImgDialog extends Dialog implements View.OnClickListener {

    private Context context;
    private TextView tvCancelshare;
    private RelativeLayout rl_sharewx,rl_shareqq,rl_sharewb,rl_sharepyq,rl_shareqqzone;

    private setChoseTypeListener choseTypeListener;

    public ChooseShareWxImgDialog(@NonNull Context activity) {
        super(activity, R.style.CustomDialog_Translucent);
        this.context = activity;
        setCanceledOnTouchOutside(true); // 点击空白区域可以Dismiss对话框
        setCancelable(true); // 点击返回按键可以Dismiss对话框
        init();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        init();
    }

    public void init() {
        LayoutInflater inflater = LayoutInflater.from(context);
        View view = inflater.inflate(R.layout.dialog_sharewx_someimg, null);
        setContentView(view);

        tvCancelshare = findViewById(R.id.tvCancelshare);
        rl_sharewx = findViewById(R.id.rl_sharewx);
        rl_sharepyq = findViewById(R.id.rl_sharepyq);

        tvCancelshare.setOnClickListener(this);
        rl_sharewx.setOnClickListener(this);
        rl_sharepyq.setOnClickListener(this);

        Window dialogWindow = getWindow();
        WindowManager.LayoutParams lp = dialogWindow.getAttributes();
        dialogWindow.setGravity(Gravity.BOTTOM);
        DisplayMetrics d = context.getResources().getDisplayMetrics(); // 获取屏幕宽、高用
        lp.width = WindowManager.LayoutParams.MATCH_PARENT; // 高度设置为屏幕的0.6
        lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
        dialogWindow.setAttributes(lp);

    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.rl_sharewx:
                choseTypeListener.onChoseType(1);
                break;
            case R.id.rl_sharepyq:
                choseTypeListener.onChoseType(2);
                break;
            case R.id.tvCancelshare:
                this.dismiss();
                break;
            default:
                this.dismiss();
                break;

        }
        this.dismiss();
    }
    public void setChoseTypeListener(setChoseTypeListener listener){
            this.choseTypeListener = listener;
    }

    public interface setChoseTypeListener {
        void onChoseType(int type);
    }
}

//样式



//dialog布局文件自己定义


4,每次新的页面打开,请求数据回来记得情况把缓存清空,每次只保存新的

 

 

PosterXQImgCache.getInstance().removeImgCache();//先清空路径缓存
ImgFileUtils.deleteDir();//删除本地缓存的图片
//缓存图片到本地
for (int i = 0; i < images.size(); i++) {
    Glide.with(this)
            .load(images.get(i).getPic_url()).asBitmap().into(new SimpleTarget() {
        @Override
        public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) {
            ImgFileUtils.saveBitmap(PosterXQActivity.this, resource, StringUtils.setDateTime());
        }
    });
}

这样就实现一键转发图片或者文字到微信或者朋友圈的功能,每一个问题的解决都将让你前进一步,加油!

 

你可能感兴趣的:(一键转发多张图片到微信朋友圈,好友功能)