昨天公司老大通知客戶改需求了,原來的微信分享改爲分享多張圖片,而後屁顛屁顛跑到微信平臺看了之後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