最近因為公司的項目要求,需要做的一件事情就是將本App的文件分享給微信好友厢呵。遇到這種需求的第一件事肯定是進(jìn)入微信開放平臺查看微信分享的文檔(微信分享)窝撵,不看還好,看了頓時會有一種想罵人的感覺襟铭,因為文檔里面根本就沒有所謂的文件分享碌奉,明確告訴了我們微信分享及收藏目前支持文字短曾、圖片、音樂赐劣、視頻嫉拐、網(wǎng)頁共五種類型。是不是有一萬頭草泥馬在你腦海里奔騰而過魁兼?不過沒關(guān)系婉徘,微信和支付寶的文檔坑應(yīng)該大家早有耳聞,文檔沒有的東西咐汞,大家就應(yīng)該通過強(qiáng)大的百度或者谷歌進(jìn)行搜索了盖呼,相信這應(yīng)該是大家的強(qiáng)項。
各種搜索之后化撕,終于被我找到了微信分享的SDK里面還有一個WXFileObject几晤,看到這個類,相信大家可以長呼一口氣了植阴,不過別者急蟹瘾,你才剛開始入坑,讓我們首先來看第一種方式:
private void ShareFileToWeiXin() {? ? ? ? ??
?WXFileObject fileObj = new WXFileObject();
fileObj.fileData= WXUtil.inputStreamToByte(ALBUM_PATH+OKFileName);//文件路徑fileObj.filePath= ALBUM_PATH + OKFileName;//使用媒體消息分享 ? ? ? ??
WXMediaMessage msg = new WXMediaMessage(fileObj);
msg.title="title";//發(fā)送請求? ? ? ??
SendMessageToWX.Reqreq = new SendMessageToWX.Req();//創(chuàng)建唯一標(biāo)識? ? ? ? ? req.transaction= String.valueOf(System.currentTimeMillis());
req.message= msg;req.
scene= SendMessageToWX.Req.WXSceneSession;
wxapi.sendReq(req);}
這種方式是會同時將文件的路徑以及將文件轉(zhuǎn)化的byte[]數(shù)組分享給微信好友墙贱,這種方式看起來是可以的热芹,而且使用的時候在某些情況下也是可行的,某些情況下是指分享一些小文件(小于1M),如果我們剛才拿的是一個小文件進(jìn)行測試惨撇,你會你覺得自己寫的很不錯伊脓,會想著這功能也不過如此,然后信心滿滿的拿給測試去測魁衙。但是問題馬上就會來了报腔,當(dāng)測試測過幾輪之后,就會發(fā)現(xiàn)分享大文件的時候微信調(diào)不出來剖淀,這時候我想你就該蛋疼了纯蛾。于是開始各種百度,或者去看文檔里面的常見問題纵隔,里面的確提到了不能正常調(diào)起微信的幾種情況
仔細(xì)的看上面的代碼翻诉,你會發(fā)現(xiàn)我們根本就沒有發(fā)送縮略圖,然后你會想著把其他的幾種情況都試一遍捌刮。試了幾遍之后碰煌,你會發(fā)現(xiàn)都不管用,這時候我想你都快奔潰了吧绅作,這時候你可能又會想起AndroidStudio可以看源碼芦圾,于是你又去看WXFileObject源碼。源碼如下
相信你一眼就能看到CONTENT_LENGTH_LIMIT =10485760(10M),很負(fù)責(zé)任的告訴大家俄认,這個的確是限制分享文件大小的个少,但是你可能就會更奇怪了洪乍,我明明分享的是10M之內(nèi),為啥不可以夜焦,這時候你有沒有開始心里罵微信了壳澳,這是什么鬼『剑可能這時你又會仔細(xì)的去看微信分檔里面的其他示例钾埂。
看過幾次之后,相信我們會看到網(wǎng)頁分享URL這塊科平,這時我們就應(yīng)該想到褥紫,既然網(wǎng)頁Url可以分享,那我可不可以直接分享文件的地址瞪慧,這時聰明的你如果把fileObj.fileData = WXUtil.inputStreamToByte(ALBUM_PATH+OKFileName);這句話給注釋掉髓考,重新編譯,我們就會發(fā)現(xiàn)神奇的事情發(fā)生了弃酌,微信馬上就被調(diào)起了氨菇,是不是感覺很驚奇?好吧妓湘,有時候事情就是這樣查蓉,多此一舉導(dǎo)致坑了自己,直接分享我的源碼吧
WXFileObject fileObject = newWXFileObject();fileObject.setContentLengthLimit(1024*1024*10);
fileObject.setFilePath(filePath +"/"+ fileName);//設(shè)置文件本地地址
WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject= fileObject;msg.title= fileName;
SendMessageToWX.Reqreq = new SendMessageToWX.Req();
req.transaction= buildTransaction("file");
req.message= msg;
req.scene= mTargetScene;
LogUtils.i("SendToWXActivity","mTargetScene---"+ buildTransaction("file") +"---"+ msg);
api.sendReq(req);
好了榜贴,寫了半天豌研,可能很多廢話,多多包涵吧唬党,有啥想交流的鹃共,歡迎給我評論。