一键转发按钮,直接把多张图片拉起朋友圈,自动填充图片,或者多张图片发给好友,文字可以复制过去直接粘贴,
实现思路:
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 super Bitmap> 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 super Bitmap> glideAnimation) {
ImgFileUtils.saveBitmap(PosterXQActivity.this, resource, StringUtils.setDateTime());
}
});
}
这样就实现一键转发图片或者文字到微信或者朋友圈的功能,每一个问题的解决都将让你前进一步,加油!