最近由于公司想弄一個新手推薦活動青灼,因為是推薦活動急灭,必須借用現(xiàn)在流行的社交軟件進行各種分享帽借,只要形式有微信分享到好友或者朋友圈珠增、QQ分享給好友或者空間、微博分享和短信分享等砍艾。下面我就跟大家一起聊下在分享的過程中所遇到的各種坑蒂教。本文來自于自己的經(jīng)驗,不足的地方還請指正脆荷。首先說下我是怎么實現(xiàn)的凝垛,然后給大家說下實現(xiàn)過程中應(yīng)該注意的。
##微信支付
1. 微信支付注冊``` api = WXAPIFactory.createWXAPI(this, AppConfig.WEIXIN_PAY_ID, false);```? > 第二個參數(shù)是我們在微信開放平臺申請的Pay_ID? > 第三個參數(shù)代表是否進行校驗.2. 微信推薦我們從后臺生成訂單蜓谋,然后再通過app調(diào)起微信進行支付梦皮,其實也可以App里面就生成訂單,然后Appc里面進行支付桃焕。兩種都是可行的剑肯,但是大多數(shù)App并不是簡簡單單的支付,可能還要數(shù)據(jù)庫入庫覆旭,或者進行一些其他的操作退子,通過后臺生成訂單就比較好岖妄,大家可以根據(jù)自己的需求型将,選擇適合自己的。3. 當訂單生成之后荐虐,我們需要拼接調(diào)起微信支付的請求PayReq: ```javaPayReq request = new PayReq(); request.appId = object.getString("appId"); request.partnerId = object.getString("partnerId"); request.prepayId = object.getString("prepayId"); request.packageValue = object.getString("package"); request.nonceStr = object.getString("nonceStr"); request.timeStamp = object.getString("timeStamp"); request.sign = object.getString("sign"); api.sendReq(request); ```? **通過api.sendReq(),我們就能調(diào)起微信進行支付啦七兜。一般情況下還是比較容易調(diào)起 的,如果沒反應(yīng)福扬,請檢查自己的APP_ID腕铸,然后在檢查一下自己的PayReq惜犀,然后在檢查一下,是否添加了必須的權(quán)限狠裹。**? 4. 微信成功調(diào)起虽界,輸入密碼成功支付之后,如果我們想要知道微信支付的結(jié)果涛菠,就必須在應(yīng)用包名下莉御,新建一個wxapi的包,然后新建一個WXPayEntryActivity俗冻,重點注意包名和activity的名字不要寫錯礁叔,微信是通過包名加activity的名稱通過反射跳轉(zhuǎn)到該頁面。這樣還不夠迄薄,需要實現(xiàn)微信定義的IWXAPIEventHandler琅关,重寫onResp和onReq,在onReq里面我們可以對app發(fā)送到微信的請求做些處理讥蔽,在onResp我們可以接收到微信返回的結(jié)果涣易。返回結(jié)果bean里面的errCode比較簡單,0代表成功都毒,-1代表失敗碰缔,-2代表取消金抡。這樣還不夠,還要調(diào)用iwxapi.handleIntent(getIntent(), this)在能正真的接收到微信返回的消息榛瓮。如果沒能成功的接收到微信返回的消息禀晓,依次檢查包名activity名是否與規(guī)定的不符坝锰,檢查是否在AndroidMianfest里面注冊了activity顷级,然后是否調(diào)用了iwxapi.handleIntent(getIntent(), this)。###以上就是微信支付的總結(jié)帽芽,主要注意1. 權(quán)限是否添加2. **wxapi和WXPayEntryActivity的包名是否正確**3. **在 WXPayEntryActivity里面是否調(diào)用了iwxapi.handleIntent(getIntent(), this)**## 微信分享1. 首先檢測手機是否安裝了微信,通過微信自定義的方法```javaIWXAPI api = WXAPIFactory.createWXAPI(context, AppConfig.WEIXIN_PAY_ID, false);? if (api.isWXAppInstalled() && api.isWXAppSupportAPI()) {? ? ? ? flag = true;? ? }```>api.isWXAppInstalled()返回微信是否安裝>api.isWXAppSupportAPI()返回微信是否支持支付2. 在初始化了api之后披泪,我們需要把應(yīng)用注冊到微信`api.registerApp(AppConfig.WEIXIN_PAY_ID);`3. 下面就是創(chuàng)建WXobject和wxMessage付呕,說明文檔上有具體的代碼跌捆,分享文字佩厚,圖片,音頻等詳細代碼潮瓶,我就不一一重述了毯辅,大家自己去微信開放平臺查看代碼煞额。通過api.sendReq(req)我們就能調(diào)起微信分享的界面膊毁。4. 跟微信支付一樣,我們 需要在wxapi包下面新建一個WXEntryActivity描焰,并且實現(xiàn)IWXAPIEventHandler才能接收到是否分享成功荆秦。###如果沒有分享成功力图,依次檢查:1. **分享之前時候注冊了應(yīng)用到微信**```javaapi.registerApp(AppConfig.WEIXIN_PAY_ID);```2. **WXEntryActivity是否注冊了**3. **是否添加了必要的權(quán)限**## QQ分享1. 首先導(dǎo)入必須的mta_sdk.jar和open_sdk.jar2. AndroidManifest里面添加3. Tencent是QQ的入口搪哪,需要實例化Tencent:`Tencent:mTencent = Tencent.createInstance(APP_ID, this.getApplicationContext());`4. 實現(xiàn)回調(diào):IUiListener,QQ的所有操作都是通過這個回調(diào)的晓折,如果要想接收到QQ的回調(diào),還需要重寫onActivityRes###如果沒有分享成功漾月,依次檢查:1. **是否添加必要的權(quán)限**2. **是否在Manifest里面注冊了必要的activity梁肿,重點注意的是觅彰,這里以Tencent 開頭,后面的數(shù)字是自己申請的appkey烛芬,當初就是這里沒有處理赘娄,導(dǎo)致QQ一直無法調(diào)起**3. **如果分享成功宏蛉,但是不能接收到回調(diào)拾并,檢查是否重寫了onActivityResult()**## 微博分享#####微博里面文檔比較全,他涉及到的東西也非常多个榕,我們移動app比較關(guān)注的是他的分享和登陸芥喇。 1. 導(dǎo)入jar包和so庫 2. 在Manifest里面添加:? ```xml```? ? ? >這是微博自帶的有個webview,當你手機沒有安裝微博的時候械馆,可以通過H5實現(xiàn)分享和登陸霹崎。如果沒有注冊的話冶忱,當沒安裝微博客戶端的時候,無法調(diào)起微博H5頁面派诬; 3. 實現(xiàn)IWeiboHandler.Response接口默赂,用于接收微博分享的結(jié)果 4. 實例化IWeiboShareAPI缆八、注冊,處理微博分享 的結(jié)果:? ```java mWeiboShareAPI=WeiboShareSDK.createWeiboAPI(context.getApplicationContext(), AppConfig.WEIBO_APPID);? ? ? ? mWeiboShareAPI.registerApp(); mWeiboShareAPI.handleWeiboResponse(getIntent(), this);//處理微博分享的結(jié)果栏妖; ```###如果沒有分享成功底哥,一次檢查:1. 因為微博審核比較嚴格趾徽,只有當審核通過之后才能分享成功翰守,有可能并不是你的代碼問題蜡峰,而是審核沒有通過湿颅,導(dǎo)致分享失敗2. 在沒有安裝微博的情況下,不能跳到微博分享的H5,檢查Manifest里面是否注冊了微博的H5 webview;3. 添加必須的權(quán)限**下面分享我自己寫的一個ShareUtils崭庸,里面實現(xiàn)了QQ怕享,微信函筋,微博分享跌帐,大家可以自行下載對照。```javaimport android.app.Activity;import android.content.Context;import android.content.Intent;import android.content.SharedPreferences;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.net.Uri;import android.os.Bundle;import android.widget.Toast;import com.sina.weibo.sdk.api.TextObject;import com.sina.weibo.sdk.api.WebpageObject;import com.sina.weibo.sdk.api.WeiboMessage;import com.sina.weibo.sdk.api.WeiboMultiMessage;import com.sina.weibo.sdk.api.share.IWeiboShareAPI;import com.sina.weibo.sdk.api.share.SendMessageToWeiboRequest;import com.sina.weibo.sdk.api.share.SendMultiMessageToWeiboRequest;import com.sina.weibo.sdk.api.share.WeiboShareSDK;import com.sina.weibo.sdk.auth.AuthInfo;import com.sina.weibo.sdk.auth.Oauth2AccessToken;import com.sina.weibo.sdk.auth.WeiboAuthListener;import com.sina.weibo.sdk.exception.WeiboException;import com.sina.weibo.sdk.utils.Utility;import com.tencent.connect.common.Constants;import com.tencent.connect.share.QQShare;import com.tencent.connect.share.QzoneShare;import com.tencent.mm.sdk.modelmsg.SendMessageToWX;import com.tencent.mm.sdk.modelmsg.WXMediaMessage;import com.tencent.mm.sdk.modelmsg.WXWebpageObject;import com.tencent.mm.sdk.openapi.IWXAPI;import com.tencent.mm.sdk.openapi.WXAPIFactory;import com.tencent.tauth.IUiListener;import com.tencent.tauth.Tencent;import java.io.ByteArrayOutputStream;import java.util.ArrayList;public class ShareUtils {? ? private static final String PREFERENCES_NAME = "com_weibo_sdk_android";? ? private static final String KEY_UID = "uid";? ? private static final String KEY_ACCESS_TOKEN = "access_token";? ? private static final String KEY_EXPIRES_IN = "expires_in";? ? private static final String KEY_REFRESH_TOKEN = "refresh_token";? ? public static boolean isWeiXinInstallAndSupport(Context context) {? ? ? ? boolean flag = false;? ? ? ? IWXAPI api = WXAPIFactory.createWXAPI(context, AppConfig.WEIXIN_PAY_ID, false);? ? ? ? if (api.isWXAppInstalled() && api.isWXAppSupportAPI()) {? ? ? ? ? ? flag = true;? ? ? ? }? ? ? ? return flag;? ? }? ? /**? ? * @param context? ? * @param type? ? 1:分享到朋友圈? ? ? ? ? ? 2:分享到微信好友? ? * @param title? 標題? ? * @param url? ? 跳轉(zhuǎn)url? ? * @param imageId 圖片id? ? */? ? public static void shareToWeChat(Context context, int type, String title, String url, int imageId) {? ? ? ? IWXAPI api = WXAPIFactory.createWXAPI(context, AppConfig.WEIXIN_PAY_ID);? ? ? ? api.registerApp(AppConfig.WEIXIN_PAY_ID);? ? ? ? Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), imageId);? ? ? ? Bitmap thumbBmp = Bitmap.createScaledBitmap(bitmap, 150, 150, true);? ? ? ? bitmap.recycle();? ? ? ? WXWebpageObject webpageObject = new WXWebpageObject();? ? ? ? webpageObject.webpageUrl = url;? ? ? ? WXMediaMessage msg = new WXMediaMessage();? ? ? ? msg.mediaObject = webpageObject;? ? ? ? msg.title = title;? ? ? ? msg.thumbData = bmpToByteArray(thumbBmp, true);? ? ? ? SendMessageToWX.Req req = new SendMessageToWX.Req();? ? ? ? req.message = msg;? ? ? ? req.transaction = System.currentTimeMillis() + "";? ? ? ? req.scene = type == 1 ? SendMessageToWX.Req.WXSceneTimeline : SendMessageToWX.Req.WXSceneSession;? ? ? ? api.sendReq(req);? ? }? ? /**? ? * @param context? ? * @param title? ? ? 標題? ? * @param description 描述? ? * @param url? ? ? ? 跳轉(zhuǎn)URL? ? * @param imageUrl? ? 圖片鏈接? ? * @param callBack? ? */? ? public static void shareToQQ(Tencent mTencent, Context context, String title, String description, String url, String imageUrl, IUiListener callBack) {? ? ? ? Bundle params = new Bundle();? ? ? ? params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_DEFAULT);? ? ? ? params.putString(QQShare.SHARE_TO_QQ_TITLE, title);? ? ? ? params.putString(QQShare.SHARE_TO_QQ_SUMMARY, description);? ? ? ? params.putString(QQShare.SHARE_TO_QQ_TARGET_URL, url);? ? ? ? params.putString(QQShare.SHARE_TO_QQ_IMAGE_URL, imageUrl);? ? ? ? params.putString(QQShare.SHARE_TO_QQ_APP_NAME, App名字);? ? ? ? mTencent.shareToQQ((Activity) context, params, callBack);? ? }? ? /**? ? * @param context? ? * @param picLists? ? 圖片arraylist,可以分享多張圖片? ? * @param title? ? ? 標題? ? * @param description 描述? ? * @param url? ? ? ? 跳轉(zhuǎn)url? ? * @param callBack? ? */? ? public static void shareToZone(Context context, ArrayListpicLists, String title, String description, String url, IUiListener callBack) {