昨天公司老大通知客戶改需求了,原來的微信分享改成分享多張圖片,然后屁顛屁顛跑到微信平台看了以后
心里千萬只草泥馬狂奔而過,微信平台沒有提供分享多張的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
