日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

android 微信分享 源码,记录Android微信分享功能的吐槽与思考

發(fā)布時(shí)間:2024/3/13 Android 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android 微信分享 源码,记录Android微信分享功能的吐槽与思考 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在App內(nèi)潛入分享到微信好友或朋友圈的功能想必大家已經(jīng)屢見(jiàn)不鮮了,比如Android分享一個(gè)網(wǎng)頁(yè)信息(URL)到微信客戶端的代碼:

/**

* 微信分享:分享網(wǎng)頁(yè)

* @param context

* @param url

* @param title

* @param description

* @param scene

*/

public static void shareToWeChatWithWebpage(Context context, String url,

String title, String description, int scene){

IWXAPI iwxapi = WXAPIFactory.createWXAPI(context, WXEntryActivity.WXAPI_APP_ID);

if (!iwxapi.isWXAppInstalled()){

ToastManager.getInstance(context.getApplicationContext()).showToast("您尚未安裝微信客戶端");

return;

}

WXWebpageObject wxWebpageObject = new WXWebpageObject();

wxWebpageObject.webpageUrl = url;

WXMediaMessage wxMediaMessage = new WXMediaMessage(wxWebpageObject);

wxMediaMessage.mediaObject = wxWebpageObject;

wxMediaMessage.title = title;

wxMediaMessage.description = description;

wxMediaMessage.thumbData =

ImageManager.bmpToByteArray(BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_share_invite), true);

SendMessageToWX.Req req = new SendMessageToWX.Req();

req.transaction = String.valueOf(System.currentTimeMillis());

req.message = wxMediaMessage;

req.scene = scene;

iwxapi.sendReq(req);

}

雖然已經(jīng)在不同的App內(nèi)使用了N遍,但在最近的一個(gè)項(xiàng)目中還是出了錯(cuò):執(zhí)行完這段代碼,應(yīng)用沒(méi)有任何反應(yīng),無(wú)法調(diào)起微信客戶端,并且沒(méi)有任何錯(cuò)誤信息打印提示。不得已查看官方資料 —— [Android常見(jiàn)問(wèn)題],找到這樣一段提示:

Q:調(diào)用wxapi.sendReq接口,返回true,但微信客戶端并未啟動(dòng),請(qǐng)檢查以下幾項(xiàng):

A:?1)微信是否安裝

2)調(diào)用時(shí)的Apk包名和簽名是否與開(kāi)放平臺(tái)填寫的一致,簽名請(qǐng)使用該工具:點(diǎn)擊下載,常發(fā)生在安裝了debug版本又安裝release版本情況,確定包名簽名后卸載微信重裝或者清除微信數(shù)據(jù)再做測(cè)試

3)檢查發(fā)送時(shí)的縮略圖大小是否超過(guò)32k

4)能夠調(diào)起微信到選擇好友列表,但是點(diǎn)擊發(fā)送后無(wú)響應(yīng),請(qǐng)檢查proguard配置是否對(duì)微信SDK代碼進(jìn)行了混淆,建議不要對(duì)SDK對(duì)混淆,參考以下proguard配置:

-keep class com.tencent.mm.sdk.** {

*;

}

經(jīng)檢查,發(fā)現(xiàn)代碼iwxapi.sendReq(req);執(zhí)行過(guò)后返回了false,其實(shí)按照上面Q&A的寫法,已經(jīng)不屬于該問(wèn)題范疇了。但是還是照著這四點(diǎn)檢查了一遍,發(fā)送的縮略圖本地預(yù)覽大小只有不到20KB,其他配置也沒(méi)有問(wèn)題,可還是出錯(cuò),到底問(wèn)題出在哪里了呢?

糾結(jié),沉思,差點(diǎn)就懷疑人生了!最后冒著試一試的態(tài)度,我把縮略圖換成一張不到7KB的小圖,再次執(zhí)行代碼,結(jié)果驚人地發(fā)現(xiàn):iwxapi.sendReq(req);返回true,并成功調(diào)起微信客戶端!當(dāng)時(shí)心中一萬(wàn)頭草泥馬奔騰而過(guò)啊!

一番激動(dòng)之后,就開(kāi)始研究了,為什么之前使用的縮略圖沒(méi)有超過(guò)官網(wǎng)文檔32K的限制,卻無(wú)法調(diào)起微信客戶端呢,難道官網(wǎng)文檔寫錯(cuò)了,上限不是32KB?于是回歸源碼,打開(kāi)微信SDK提供的類WXMediaMessage,找到如下定義的一系列常量:

public static final int THUMB_LENGTH_LIMIT = 32768;

private static final int TITLE_LENGTH_LIMIT = 512;

private static final int DESCRIPTION_LENGTH_LIMIT = 1024;

private static final int MEDIA_TAG_NAME_LENGTH_LIMIT = 64;

private static final int MESSAGE_ACTION_LENGTH_LIMIT = 2048;

private static final int MESSAGE_EXT_LENGTH_LIMIT = 2048;

果不其然,微信SDK對(duì)于分享到微信的縮略圖大小、標(biāo)題長(zhǎng)度、描述長(zhǎng)度等信息都做了限制。其中,縮略圖大小限制為32768,源碼中并沒(méi)有注釋寫明單位。好奇的我將其除以1024,剛好得到32,這不就是官網(wǎng)文檔提到的上限值32KB嘛(說(shuō)明源碼中的數(shù)值單位為Byte)!那就是說(shuō)官網(wǎng)文檔沒(méi)有寫錯(cuò),可是問(wèn)題出在哪兒了呢?

其實(shí)事關(guān)圖片的實(shí)際硬盤占用大小和內(nèi)存占用大小問(wèn)題。存放在電腦硬盤中的圖片文件,會(huì)根據(jù)不同圖片格式的壓縮規(guī)則進(jìn)行壓縮,從而減少硬盤占用大小,比如常見(jiàn)如JPEG這種有損壓縮的圖片格式。而在Android系統(tǒng)中,將圖像讀取到內(nèi)存當(dāng)中所占用的內(nèi)存大小與圖片存放在硬盤當(dāng)中的實(shí)際大小沒(méi)有一點(diǎn)關(guān)系,可能更大,也可能更小,使用如下代碼即可獲取圖像所占用的內(nèi)存大小:

private Bitmap decodeResource(Resources resources, int id) {

TypedValue value = new TypedValue();

resources.openRawResource(id, value);

BitmapFactory.Options opts = new BitmapFactory.Options();

opts.inTargetDensity = value.density;

Bitmap bitmap = BitmapFactory.decodeResource(resources, id, opts);

Log.i("Bitmap", "size is " + bitmap.getRowBytes() * bitmap.getHeight());

return bitmap;

}

其中,bitmap.getRowBytes() * bitmap.getHeight()獲取的便是Bitmap的內(nèi)存占用大小,單位為Byte,再除以1024,便可以轉(zhuǎn)換為BK單位。注意:上述從資源中獲取Bitmap對(duì)象的過(guò)程,并沒(méi)有直接使用decodeResource(Resources res, int id)含帶兩個(gè)參數(shù)的方法,是為了避免由于圖片存放在不同drawable或者mipmap文件夾下導(dǎo)致的內(nèi)存占用不一致問(wèn)題,對(duì)Android屏幕適配有所了解的朋友應(yīng)該懂得這個(gè),這里就不細(xì)說(shuō)了,大家可以參考凱子哥的一篇文章 —— [關(guān)于Android中圖片大小、內(nèi)存占用與drawable文件夾關(guān)系的研究與分析]。

通過(guò)PS工具,修改縮略圖尺寸大小,然后通過(guò)上面這段代碼測(cè)試不同大小的圖片在Android手機(jī)中所占用的內(nèi)存大小,同時(shí)查看是否可以調(diào)起微信客戶端。經(jīng)過(guò)這樣的測(cè)試,最終發(fā)現(xiàn),微信SDK和官方文檔中的32KB縮略圖上限大小指的是內(nèi)存占用大小,而非圖片的硬盤占用大小。這樣,也就解決了前面我所遇到的問(wèn)題。

最后,還是得吐槽一下Android微信SDK的詬病,也是一些包括支付寶SDK在內(nèi)其他第三方服務(wù)供應(yīng)商的通用問(wèn)題,別無(wú)他意,僅作發(fā)泄:

?簽名唯一性

做Android開(kāi)發(fā)的都知道,開(kāi)發(fā)過(guò)程中編譯打包并運(yùn)行在手機(jī)或模擬器上的apk文件使用的是IDE提供的默認(rèn)通用簽名,而正式上線發(fā)布的apk文件使用的是開(kāi)發(fā)人員自定義的正式簽名文件。微信SDK在注冊(cè)應(yīng)用時(shí)只能輸入一個(gè)簽名信息,導(dǎo)致必須在正式包中測(cè)試微信SDK相關(guān)功能,而正式包又無(wú)法做到跟蹤調(diào)試,非常不方便。當(dāng)然你也可以這樣做,處于開(kāi)發(fā)階段時(shí),在微信開(kāi)放平臺(tái)注冊(cè)測(cè)試包的簽名信息,上線時(shí)再修改成正式簽名文件信息;或者你也可以修改IDE的默認(rèn)簽名文件。但是這些都不是很方便,如果微信開(kāi)放平臺(tái)能夠像其他一些第三方服務(wù)供應(yīng)商一樣,針對(duì)一個(gè)應(yīng)用提供兩個(gè)或多個(gè)簽名信息的注冊(cè),豈不快哉。

?文檔不清晰

很多大型的第三方服務(wù)供應(yīng)商只管功能的提供,不管文檔的說(shuō)明,甚至連Samples代碼都寫的亂七八糟的,導(dǎo)致我們開(kāi)發(fā)人員在使用過(guò)程中連個(gè)完整的參考說(shuō)明都沒(méi)有,出了問(wèn)題也無(wú)從下手,白白浪費(fèi)很多不必要的時(shí)間和精力。

文章有些啰嗦,主要是闡述了自己這次在開(kāi)發(fā)微信分享時(shí)遇到問(wèn)題、分析問(wèn)題并解決問(wèn)題的過(guò)程,希望給大家一些借鑒。

總結(jié)

以上是生活随笔為你收集整理的android 微信分享 源码,记录Android微信分享功能的吐槽与思考的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。