android 实现微信分享多张图片的功能

昨天公司老大通知客户改需求了,原来的微信分享改为分享多张图片,而后屁颠屁颠跑到微信平台看了之后android

内心千万只草泥马狂奔而过,微信平台没有提供分享多张的SDK有木有啊,咱们只能本身调用系统自带的分享功能实现。git

这儿我先讲下流程,后面会附上源码。github

首先咱们讲下调起微信分享的方法。其实方法都是同样的,没有太大的区别。微信

 

//com.tencent.mm.ui.tools.ShareImgUi   是分享到微信好友网络

//com.tencent.mm.ui.tools.ShareToTimeLineUI  是分享到微信朋友圈ide

//intent.put("kdescription","分享朋友圈的图片说明");工具

 

Intent intent = new Intent();布局

ComponentName comp = new ComponentName("com.tencent.mm","com.tencent.mm.ui.tools.ShareImgUi");ui

intent.setComponent(comp);this

intent.setAction(Intent.ACTION_SEND_MULTIPLE);

intent.setType("image/*");

 

ArrayList(Uri) imageUris = new ArrayList<Uri>();

for(File f : files){

imageUris.add(Uri.fromFile(f));

}

 

intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM,imageUris);

startActivity(intent);

 

其实来讲分享的代码很简单。可是实际操做中就跳了更多的坑,我一个一个的记录下来。

 

实际分享的时候由于是调用系统本地的分享功能,因此分享的图片也就必需要存到本地,否则就会提示获取资源失败,只支持分享到朋友圈等等的问题。

那就要把图片存到本地了,这个方法网上也有不少,我这儿就直接用了网上一个朋友的代码,而后稍微修改了一下,后面附上代码。

 

由于考虑到若是存的图片太多就太占内存了,因此最多设置分享9张,每次调起分享的时候都会从iv_share_1.jpg开始

这个是直接调用微信的分享,因此调起分享的时候必定要判断手机里面是否已经安装了微信,若是没有安装还要掉微信分享就是直接崩溃掉。

 

都到了这一步就已经能调起微信的多张图片分享了,可是其中仍是会有一个坑,也是卡了我很多时间。那就是android N系统之后分享的连接用file://.....

的时候会出现一个异常android.os.FileUriExposedException。网上虽然不少朋友都给出了用 v4包中的FileProvider来解决,可是不知道为何,反正个人

项目导入后就报错了,最后在网上找了另外一个方法在项目的BaseApplication的onCreate中用VmPolicy的方法解决。

 

//解决android N(>=24)系统以上分享 路径为file://时的 android.os.FileUriExposedException异常
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
    StrictMode.setVmPolicy(builder.build());
}

 

到这儿之后就搞定了微信的多张图片分享。下面就贴出个人代码,但愿对你们有所帮助。

布局中就放入了两个按钮,经过按钮传递一个参数判断是分享朋友圈仍是微信好友

MainActivity中的代码

 

/**
 *
 * @param flag  0分享给微信好友  1分享到朋友圈
 */
private void shareImage(final int flag) {

    //判断是否安装微信,若是没有安装微信 又没有判断就直达微信分享是会挂掉的
   if (!Tools.isWeixinAvilible(mContext)){
       Toast.makeText(MainActivity.this, "您尚未安装微信", Toast.LENGTH_SHORT).show();

   }else{

       new Thread(new Runnable() {
           @Override
           public void run() {
               //这一步必定要clear,否则分享了朋友圈立刻分享好友图片就会翻倍
               files.clear();

               try {

                   for (int i = 0; i < stringItem.length; i++) {
                       File file = Tools.saveImageToSdCard(mContext, stringItem[i]);
                       files.add(file);
                   }

                   Intent intent = new Intent();
                   ComponentName comp;

                   if (flag == 0) {
                       comp = new ComponentName("com.tencent.mm", "com.tencent.mm.ui.tools.ShareImgUI");
                   } else {
                       comp = new ComponentName("com.tencent.mm", "com.tencent.mm.ui.tools.ShareToTimeLineUI");
                       intent.putExtra("Kdescription", "分享朋友圈的图片说明");
                   }
                   intent.setComponent(comp);
                   intent.setAction(Intent.ACTION_SEND_MULTIPLE);
                   intent.setType("image/*");

                   ArrayList<Uri> imageUris = new ArrayList<Uri>();
                   for (File f : files) {
                       imageUris.add(Uri.fromFile(f));
                   }

                   intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris);
                   startActivity(intent);
               }catch (Exception e){
                   e.printStackTrace();
               }
           }
       }).start();

   }


}

 

 

而后就是调用Tools工具类中的或取临时保存的图片的地址。

 

public static String IMAGE_NAME = "iv_share_";
public static int  i =0;

//根据网络图片url路径保存到本地
public static final File saveImageToSdCard(Context context, String image) {
    boolean success = false;
    File file = null;
    try {
        file = createStableImageFile(context);

        Bitmap bitmap = null;
        URL url = new URL(image);
        HttpURLConnection conn = null;
        conn = (HttpURLConnection) url.openConnection();
        InputStream is = null;
        is = conn.getInputStream();
        bitmap =  BitmapFactory.decodeStream(is);

        FileOutputStream outStream;

        outStream = new FileOutputStream(file);
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, outStream);
        outStream.flush();
        outStream.close();
        success = true;
    } catch (Exception e) {
        e.printStackTrace();
    }

    if (success) {
        return file;
    } else {
        return null;
    }
}

	//建立本地保存路径
	public static File createStableImageFile(Context context) throws IOException {
    		i++;
    		String imageFileName =IMAGE_NAME + i+ ".jpg";
    		File storageDir = context.getExternalCacheDir();
    		File image = new File(storageDir, imageFileName);
    		return image;
		}

 

至于判断是否安装了微信这个你们在网上随便搜搜都能找到。

 

这样就大功告成了。分享都不用去等待微信平台的审核了。可是由于是调用系统的分享,因此也有不足的地方,那就是没有回调。

 

地址:https://github.com/XW837156540/ShareMoreImage

https://blog.csdn.net/XuWei1213/article/details/78547684

相关文章
相关标签/搜索