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


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

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

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

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

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

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

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

    Intent intent = new Intent();

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

    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);

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

    实际分享的时候因为是调用系统本地的分享功能,所以分享的图片也就必须要存到本地,不然就会提示获取资源失败,只支持分享到朋友圈等等的问题。

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

    因为考虑到如果存的图片太多就太占内存了,所以最多设置分享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

  • 相关阅读:
    JavaScript 类型转换
    Bjarne Stroustrup
    格拉丘纳斯的上下级关系理论
    成功者必须具备的三大技能
    ASP.NET/Perl.NET (转)
    iPhone/Mac ObjectiveC内存管理教程和原理剖析
    objectivec日期之间比较可用以下方法
    Centos下安装中文输入法
    C#中数字的四舍五入与只取整
    关于Application.Lock和Lock(obj)
  • 原文地址:https://www.cnblogs.com/wcLT/p/8890551.html
Copyright © 2020-2023  润新知