android 集成QQ互聯 (登錄,分享)


參考:http://blog.csdn.net/syz8742874/article/details/39271117

        http://blog.csdn.net/woblog/article/details/51095087

        Android微信SDK實現分享 里面有寫好的manager可以直接使用 ,感謝博主分享 ,但里面有個要注意的地方就是博主為了分享內容的復用導致如果你想分享不同內容的時候出現分享的還是上一個的分享,內容具體請看下面的我寫的微信分享的代碼紅字注釋

    Android微信登錄以及分享集成步驟 

   https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=1417751808&token=430d21e953346a7a3bffe76d7328630a8ea2466a&lang=zh_CN  微信官方文檔

 

常見問題 :

      1.QQ空間分享打不開不報錯,但就是打不開頁面

    注意:有可能你寫成了是這段代碼

private void shareToQzone () {
  //分享類型
  params.putString(QzoneShare.SHARE_TO_QQ_KEY_TYPE,SHARE_TO_QZONE_TYPE_IMAGE_TEXT );
    params.putString(QzoneShare.SHARE_TO_QQ_TITLE, "標題");//必填
    params.putString(QzoneShare.SHARE_TO_QQ_SUMMARY, "摘要");//選填
    params.putString(QzoneShare.SHARE_TO_QQ_TARGET_URL, "跳轉URL");//必填
    params.putString(QzoneShare.SHARE_TO_QQ_IMAGE_URL, "圖片鏈接ArrayList");
    mTencent.shareToQzone(activity, params, new BaseUiListener());
}

你注意這里的params.putString(QzoneShare.SHARE_TO_QQ_IMAGE_URL, "圖片鏈接ArrayList");

這里是錯誤的,因為要寫成這樣

ArrayList<String> imageUrls = new ArrayList<String>();

imageUrls.add("https://pic.cnblogs.com/avatar/677455/20150707171133.png");

params.putStringArrayList(QzoneShare.SHARE_TO_QQ_IMAGE_URL,imageUrls); 

后面是個集合不是一個String

應該是這樣寫代碼

/**
     * 分享到QQ空間
     */
    public static void shareToQzone(Context context,IUiListener listener) {
        //分享類型
        final Bundle params = new Bundle();
        params.putInt(QzoneShare.SHARE_TO_QZONE_KEY_TYPE,QzoneShare.SHARE_TO_QZONE_TYPE_IMAGE_TEXT);
        params.putString(QzoneShare.SHARE_TO_QQ_TITLE, "標題                    ");//必填
        params.putString(QzoneShare.SHARE_TO_QQ_SUMMARY, "摘要              ");//選填
        params.putString(QzoneShare.SHARE_TO_QQ_TARGET_URL, "http://www.qq.com/news/1.html");//必填
        ArrayList<String> imageUrls = new ArrayList<String>();
        imageUrls.add("https://pic.cnblogs.com/avatar/677455/20150707171133.png");
        params.putStringArrayList(QzoneShare.SHARE_TO_QQ_IMAGE_URL,imageUrls);
        mTencent.shareToQzone((Activity)context, params, listener);
    }

傳的參是 list  而且params.putStringArrayList()  而不是params.puString();

 

QQ分享本地和網絡圖片跟下面的紅色標注有關  QQShare開頭

/**
     * QQ分享內容
     * 分享的是本地圖片 SHARE_TO_QQ_IMAGE_LOCAL_URL
     * 分享的是網絡圖片 SHARE_TO_QQ_IMAGE_URL
     * @param context
     * @param listener
     */
    public static void shareText(Context context, BeanShareInfo info,IUiListener listener) {
        final 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, info.getTitle());
        params.putString(QQShare.SHARE_TO_QQ_SUMMARY, info.getDescription());
        params.putString(QQShare.SHARE_TO_QQ_TARGET_URL, info.getTargetUrl());
        params.putString(QQShare.SHARE_TO_QQ_IMAGE_URL, info.getShareCoverUrl());
        params.putString(QQShare.SHARE_TO_QQ_APP_NAME,  info.getAppName());
        params.getInt(QQShare.SHARE_TO_QQ_EXT_INT);
        mTencent.shareToQQ((Activity)context, params, listener);
    }

QQ空間分享也是 但注意的是QQ空間是 QzoneShare 開頭

 /**
     * 分享到QQ空間
     * 分享的是本地圖片 SHARE_TO_QQ_IMAGE_LOCAL_URL
     * 分享的是網絡圖片 SHARE_TO_QQ_IMAGE_URL
     */
    public static void shareToQzone(Context context, BeanShareInfo info, IUiListener listener) {
        //分享類型
        final Bundle params = new Bundle();
        params.putInt(QzoneShare.SHARE_TO_QZONE_KEY_TYPE,QzoneShare.SHARE_TO_QZONE_TYPE_IMAGE_TEXT);
        params.putString(QzoneShare.SHARE_TO_QQ_TITLE,info.getTitle());//必填
        params.putString(QzoneShare.SHARE_TO_QQ_SUMMARY, info.getDescription());//選填
        params.putString(QzoneShare.SHARE_TO_QQ_TARGET_URL, info.getTargetUrl());//必填
        ArrayList<String> imageUrls = new ArrayList<String>();
        imageUrls.add(info.getShareCoverUrl());
        params.putStringArrayList(QzoneShare.SHARE_TO_QQ_IMAGE_URL,imageUrls);
        mTencent.shareToQzone((Activity)context, params, listener);
    }

 

 

微信常見問題:

        android微信分享中bmpToByteArray報錯的解決方案

 1.微信分享網絡圖片 多看看官方demo里面有詳細的用法  ,這里加線程是為了不在主線程中加載網絡圖片。(不然會報異常)

 /*
     * 分享鏈接網絡圖片鏈接
     */
    private void shareWebPage(final ShareContent shareContent, final int shareType) {

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    WXWebpageObject webpage = new WXWebpageObject();
                    webpage.webpageUrl = shareContent.getURL();
                    WXMediaMessage msg = new WXMediaMessage(webpage);
                    msg.title = shareContent.getTitle();
                    msg.description = shareContent.getContent();
        //          Bitmap thumb = BitmapFactory.decodeResource(mContext.getResources(), shareContent.getPictureResource());
                    Bitmap bmp = BitmapFactory.decodeStream(new URL(shareContent.getPictureUrl()).openStream());
                    Bitmap thumb = Bitmap.createScaledBitmap(bmp, THUMB_SIZE, THUMB_SIZE, true);
                    bmp.recycle();
                    if (thumb == null) {
                        Toast.makeText(mContext, "圖片不能為空", Toast.LENGTH_SHORT).show();
                    } else {
                        msg.thumbData = Util.bmpToByteArray(thumb, true);
                    }
                    SendMessageToWX.Req req = new SendMessageToWX.Req();
                    req.transaction = buildTransaction("webpage");
                    req.message = msg;
                    req.scene = shareType;
                    mWXApi.sendReq(req);
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }).start();
    }

2.集成微信登錄和微信分享的返回碼的地方區分。

// 第三方應用發送到微信的請求處理后的響應結果,會回調到該方法
    @Override
    public void onResp(BaseResp resp) {
        String result = "";
        if (resp != null) {
            resp = resp;
        }
        switch (resp.errCode) {
            case BaseResp.ErrCode.ERR_OK:
          // 這里可以使用 官方API調用 resp.getType() 獲取是登錄后返回還是分享后返回 登錄返回為1 分享返回為2
if(resp.getType() == WE_LOGIN) { result = "登錄成功"; Toast.makeText(this, result, Toast.LENGTH_LONG).show(); String code = ((SendAuth.Resp) resp).code; mIWxData.getCode(code); }else if(resp.getType() == WE_SHARE){ result = "分享成功"; Toast.makeText(this, result, Toast.LENGTH_LONG).show(); } finish(); break; case BaseResp.ErrCode.ERR_USER_CANCEL: result = "取消"; Toast.makeText(this, result, Toast.LENGTH_LONG).show(); LoadDialog.dismiss(this); finish(); break; case BaseResp.ErrCode.ERR_AUTH_DENIED: result = "登錄被拒絕"; Toast.makeText(this, result, Toast.LENGTH_LONG).show(); finish(); break; default: result = "取消登錄"; Toast.makeText(this, result, Toast.LENGTH_LONG).show(); finish(); break; } }

 3.分享時出現hit push hold 

解決辦法是:原因是你分享的微信賬號在其他手機登陸了,但是本機還沒有退出登陸,導致沒有權限分享。重新進入微信並登陸就好了。

 

示例集成微信:

注意:關於放入SDK庫文件我就不說了,下面是放入后的代碼說明

 1.在android 的Application 中注冊微信 (注意我只是展示了application中關於微信的代碼 ,不代表里面就這些代碼,當然還有其他的代碼)

    /**
     * 微信API
     */
    public static IWXAPI api;
    /**
     * 初始化微信
     */
    private void registWX() {
        //通過WXAPIFactory工廠
        api = WXAPIFactory.createWXAPI(this,WX_APP_ID,false);
        api.registerApp(WX_APP_ID);
    }

 

 

2.先集成微信分享  可以編寫微信管理類,是參考的上面博客中的內容,直接拿來用然后自己按自己需求改了改的

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.widget.Toast;
import com.tencent.mm.sdk.modelmsg.SendMessageToWX;
import com.tencent.mm.sdk.modelmsg.WXImageObject;
import com.tencent.mm.sdk.modelmsg.WXMediaMessage;
import com.tencent.mm.sdk.modelmsg.WXTextObject;
import com.tencent.mm.sdk.modelmsg.WXVideoObject;
import com.tencent.mm.sdk.modelmsg.WXWebpageObject;
import com.tencent.mm.sdk.openapi.IWXAPI;
import com.tencent.mm.sdk.openapi.WXAPIFactory;
import java.net.URL;

/**
 *
 * 微信分享管理類
 *
 */
public class WechatShareManager {
    private static final int THUMB_SIZE = 150;

    public static final int WECHAT_SHARE_WAY_TEXT = 1;   //文字
    public static final int WECHAT_SHARE_WAY_PICTURE = 2; //圖片
    public static final int WECHAT_SHARE_WAY_WEBPAGE = 3;  //鏈接
    public static final int WECHAT_SHARE_WAY_VIDEO = 4; //視頻
    public static final int WECHAT_SHARE_TYPE_TALK = SendMessageToWX.Req.WXSceneSession;  //會話
    public static final int WECHAT_SHARE_TYPE_FRENDS = SendMessageToWX.Req.WXSceneTimeline; //朋友圈

    private static WechatShareManager mInstance;
    private ShareContent mShareContentText, mShareContentPicture, mShareContentWebpag, mShareContentVideo;
    private IWXAPI mWXApi;
    private Context mContext;

    private WechatShareManager(Context context){
        this.mContext = context;
        //初始化數據
        //初始化微信分享代碼
        initWechatShare(context);
    }

    /**
     * 獲取WeixinShareManager實例
     * 非線程安全,請在UI線程中操作
     * @return
     */
    public static WechatShareManager getInstance(Context context){
        if(mInstance == null){
            mInstance = new WechatShareManager(context);
        }
        return mInstance;
    }

    private void initWechatShare(Context context){
        if (mWXApi == null) {
  //          mWXApi = WXAPIFactory.createWXAPI(context, McvApplication.WX_APP_ID, true);
            mWXApi = McvApplication.api;  //如果你在Appcation中注冊了微信這里可用Appcation的api 我這里使用了
        }
//        mWXApi.registerApp(McvApplication.WX_APP_ID); //appcation中注冊過了 
    }

    /**
     * 通過微信分享
     * @param shareContent 分享的方式(文本、圖片、鏈接)
     * @param shareType 分享的類型(朋友圈,會話)
     */
    public void shareByWebchat(ShareContent shareContent, int shareType){
        if(checkInstall()){
            switch (shareContent.getShareWay()) {
                case WECHAT_SHARE_WAY_TEXT:
                    shareText(shareContent, shareType);
                    break;
                case WECHAT_SHARE_WAY_PICTURE:
                    sharePicture(shareContent, shareType);
                    break;
                case WECHAT_SHARE_WAY_WEBPAGE:
                    shareWebPage(shareContent, shareType);
                    break;
                case WECHAT_SHARE_WAY_VIDEO:
                    shareVideo(shareContent, shareType);
                    break;
            }
        }
    }

    /**
     * 檢查是否安裝微信
     * @return
     */
    private boolean checkInstall() {
       if(mWXApi.isWXAppInstalled()){
           return true;
       }else {
           Toast.makeText(mContext,"請安裝微信",Toast.LENGTH_SHORT).show();
           return false;
       }
    }

    private abstract class ShareContent {
        protected abstract int getShareWay();
        protected abstract String getContent();
        protected abstract String getTitle();
        protected abstract String getURL();
        protected abstract int getPictureResource();
        protected abstract String getPictureUrl();
    }

    /**
     * 設置分享文字的內容
     * @author chengcj1
     *
     */
    public class ShareContentText extends ShareContent {
        private String content;

        /**
         * 構造分享文字類
         * @param content 分享的文字內容
         */
        public ShareContentText(String content){
            this.content = content;
        }

        @Override
        protected int getShareWay() {
            return WECHAT_SHARE_WAY_TEXT;
        }

        @Override
        protected String getContent() {
            return content;
        }

        @Override
        protected String getTitle() {
            return null;
        }

        @Override
        protected String getURL() {
            return null;
        }

        @Override
        protected int getPictureResource() {
            return -1;
        }

        @Override
        protected String getPictureUrl() {
            return null;
        }
    }

    /*
     * 獲取文本分享對象 如果你每次想要分享的需要不同的內容就別進行if判斷不然會復用之前的信息 */
    public ShareContent getShareContentText(String content) {
       // if (mShareContentText == null) {
            mShareContentText = new ShareContentText(content);
       // } return (ShareContentText) mShareContentText;
    }

    /**
     * 設置分享圖片的內容
     * @author chengcj1
     *
     */
    public class ShareContentPicture extends ShareContent {
        private int pictureResource;
        public ShareContentPicture(int pictureResource){
            this.pictureResource = pictureResource;
        }

        @Override
        protected int getShareWay() {
            return WECHAT_SHARE_WAY_PICTURE;
        }

        @Override
        protected int getPictureResource() {
            return pictureResource;
        }

        @Override
        protected String getPictureUrl() {
            return null;
        }
        @Override
        protected String getContent() {
            return null;
        }

        @Override
        protected String getTitle() {
            return null;
        }

        @Override
        protected String getURL() {
            return null;
        }
    }

    /*
     * 獲取圖片分享對象  如果你每次想要分享的需要不同的內容就別進行 if 判斷不然會復用之前的信息 */
    public ShareContent getShareContentPicture(int pictureResource) {
       // if (mShareContentPicture == null) {
            mShareContentPicture = new ShareContentPicture(pictureResource);
       // } return (ShareContentPicture) mShareContentPicture;
    }

    /**
     * 設置分享鏈接的內容
     * @author chengcj1
     *
     */
    public class ShareContentWebpage extends ShareContent {
        private String title;
        private String content;
        private String url;
        private int pictureResource;
        private String pictureUrl;
        public ShareContentWebpage(String title, String content, String url,String pictureUrl){
            this.title = title;
            this.content = content;
            this.url = url;
            this.pictureUrl = pictureUrl;
        }
        public ShareContentWebpage(String title, String content, String url,int pictureResource){
            this.title = title;
            this.content = content;
            this.url = url;
            this.pictureResource = pictureResource;
        }

        @Override
        protected int getShareWay() {
            return WECHAT_SHARE_WAY_WEBPAGE;
        }

        @Override
        protected String getContent() {
            return content;
        }

        @Override
        protected String getTitle() {
            return title;
        }

        @Override
        protected String getURL() {
            return url;
        }
        @Override
        protected int getPictureResource() {
            return pictureResource;
        }

        @Override
        protected String getPictureUrl() {
            return pictureUrl;
        }
    }

    /*
     * 獲取網頁分享對象  如果你每次想要分享的需要不同的內容就別進行if判斷不然會復用之前的信息 */
    public ShareContent getShareContentWebpag(String title, String content, String url,String pictureLocalUrl) {
      // if (mShareContentWebpag == null) {
            mShareContentWebpag = new ShareContentWebpage(title, content, url, pictureLocalUrl);
      // } return (ShareContentWebpage) mShareContentWebpag;
    }

    /**
     * 設置分享視頻的內容
     * @author chengcj1
     *
     */
    public class ShareContentVideo extends ShareContent {
        private String url;
        public ShareContentVideo(String url) {
            this.url = url;
        }

        @Override
        protected int getShareWay() {
            return WECHAT_SHARE_WAY_VIDEO;
        }

        @Override
        protected String getContent() {
            return null;
        }

        @Override
        protected String getTitle() {
            return null;
        }

        @Override
        protected String getURL() {
            return url;
        }

        @Override
        protected int getPictureResource() {
            return -1;
        }

        @Override
        protected String getPictureUrl() {
            return null;
        }
    }

    /*
     * 獲取視頻分享內容 如果你每次想要分享的需要不同的內容就別進行if判斷不然會復用之前的信息
     */
    public ShareContent getShareContentVideo(String url) {
       // if (mShareContentVideo == null) {
            mShareContentVideo = new ShareContentVideo(url);
       // } return (ShareContentVideo) mShareContentVideo;
    }

    /*
     * 分享文字
     */
    private void shareText(ShareContent shareContent, int shareType) {
        String text = shareContent.getContent();
        //初始化一個WXTextObject對象
        WXTextObject textObj = new WXTextObject();
        textObj.text = text;
        //用WXTextObject對象初始化一個WXMediaMessage對象
        WXMediaMessage msg = new WXMediaMessage();
        msg.mediaObject = textObj;
        msg.description = text;
        //構造一個Req
        SendMessageToWX.Req req = new SendMessageToWX.Req();
        //transaction字段用於唯一標識一個請求
        req.transaction = buildTransaction("textshare");
        req.message = msg;
        //發送的目標場景, 可以選擇發送到會話 WXSceneSession 或者朋友圈 WXSceneTimeline。 默認發送到會話。
        req.scene = shareType;
        mWXApi.sendReq(req);
    }

    /*
     * 分享圖片
     */
    private void sharePicture(ShareContent shareContent, int shareType) {
        Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), shareContent.getPictureResource());
        WXImageObject imgObj = new WXImageObject(bitmap);

        WXMediaMessage msg = new WXMediaMessage();
        msg.mediaObject = imgObj;

        Bitmap thumbBitmap =  Bitmap.createScaledBitmap(bitmap, THUMB_SIZE, THUMB_SIZE, true);
        bitmap.recycle();
        msg.thumbData = Util.bmpToByteArray(thumbBitmap, true);  //設置縮略圖

        SendMessageToWX.Req req = new SendMessageToWX.Req();
        req.transaction = buildTransaction("imgshareappdata");
        req.message = msg;
        req.scene = shareType;
        mWXApi.sendReq(req);
    }

    /*
     * 分享鏈接,因為我這里設置的圖片是網絡圖片(http://開頭),因為android是不能在主線程中調用請求網絡的耗時操作的,所以加了線程
     */
    private void shareWebPage(final ShareContent shareContent, final int shareType) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    WXWebpageObject webpage = new WXWebpageObject();
                    webpage.webpageUrl = shareContent.getURL();
                    WXMediaMessage msg = new WXMediaMessage(webpage);
                    msg.title = shareContent.getTitle();
                    msg.description = shareContent.getContent();
        //          Bitmap thumb = BitmapFactory.decodeResource(mContext.getResources(), shareContent.getPictureResource());  //這里調用的是本工程下的資源文件下的圖片,如果是本地圖片是不用加線程的,如:R.drawable.ic_languner 
                    Bitmap bmp = BitmapFactory.decodeStream(new URL(shareContent.getPictureUrl() + "?x-oss-process=image/resize,m_fixed,h_60,w_60").openStream());  //這里是看官方dome中分享網絡圖片后改的
                    Bitmap thumb = Bitmap.createScaledBitmap(bmp, THUMB_SIZE, THUMB_SIZE, true);
                    bmp.recycle();
                    if (thumb == null) {
                        Toast.makeText(mContext, "圖片不能為空", Toast.LENGTH_SHORT).show();
                    } else {
                        msg.thumbData = Util.bmpToByteArray(thumb, true);
                    }
                    SendMessageToWX.Req req = new SendMessageToWX.Req();
                    req.transaction = buildTransaction("webpage");
                    req.message = msg;
                    req.scene = shareType;
                    mWXApi.sendReq(req);
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }).start();
    }

    /*
     * 分享視頻
     */
    private void shareVideo(ShareContent shareContent, int shareType) {
        WXVideoObject video = new WXVideoObject();
        video.videoUrl = shareContent.getURL();

        WXMediaMessage msg = new WXMediaMessage(video);
        msg.title = shareContent.getTitle();
        msg.description = shareContent.getContent();
        Bitmap thumb = BitmapFactory.decodeResource(mContext.getResources(), R.mipmap.ic_launcher);
//      BitmapFactory.decodeStream(new URL(video.videoUrl).openStream());
        /**
         * 測試過程中會出現這種情況,會有個別手機會出現調不起微信客戶端的情況。造成這種情況的原因是微信對縮略圖的大小、title、description等參數的大小做了限制,所以有可能是大小超過了默認的范圍。
         * 一般情況下縮略圖超出比較常見。Title、description都是文本,一般不會超過。
         */
        Bitmap thumbBitmap =  Bitmap.createScaledBitmap(thumb, THUMB_SIZE, THUMB_SIZE, true);
        thumb.recycle();
        msg.thumbData = Util.bmpToByteArray(thumbBitmap, true);

        SendMessageToWX.Req req = new SendMessageToWX.Req();
        req.transaction = buildTransaction("video");
        req.message = msg;
        req.scene =  shareType;
        mWXApi.sendReq(req);
    }

    private String buildTransaction(final String type) {
        return (type == null) ? String.valueOf(System.currentTimeMillis()) : type + System.currentTimeMillis();
    }
}

3.微信分享的使用

 

    private WechatShareManager mShareManager;

  /**
     * 微信分享 按照個人需求更改 我這里是自定義了一個model類來傳分享的內容,而且這里只用到了分享鏈接
     * @param isFriend 是否是朋友圈的分享
     */
    private void WChatShare(boolean isFriend){
        BeanShareInfo shareInfo = (BeanShareInfo) this.info;
        WechatShareManager.ShareContentWebpage shareWebpage = (WechatShareManager.ShareContentWebpage) mShareManager.getShareContentWebpag(shareInfo.getTitle(),shareInfo.getDescription(),shareInfo.getTargetUrl(),shareInfo.getShareCoverUrl());
        if(isFriend){  //朋友圈
            mShareManager.shareByWebchat(shareWebpage,WechatShareManager.WECHAT_SHARE_TYPE_FRENDS);
        }else{
            mShareManager.shareByWebchat(shareWebpage,WechatShareManager.WECHAT_SHARE_TYPE_TALK);
        }
    }

 

4.集成微信登錄

首先做的還是上文第1點的內容

然后開始代碼   

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;
import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.JsonHttpResponseHandler;
import com.tencent.mm.sdk.modelbase.BaseReq;
import com.tencent.mm.sdk.modelbase.BaseResp;
import com.tencent.mm.sdk.modelmsg.SendAuth;
import com.tencent.mm.sdk.openapi.IWXAPI;
import com.tencent.mm.sdk.openapi.IWXAPIEventHandler;
import com.uethinking.microvideo.application.McvApplication;
import com.uethinking.microvideo.view.LoadDialog;
import org.apache.http.Header;
import java.net.URLEncoder;

public class WXEntryActivity extends Activity implements IWXAPIEventHandler {


    /**
     * 登錄類型碼為 1
     */
    public static final int WE_LOGIN = 1;
    /**
     * 分享類型碼為 0
     */
    public static final int WE_SHARE = 2;

    private static IWxData mIWxData;
    public static void setIWxData(IWxData interfaces){
        mIWxData = interfaces;
    }
    //自己寫的回調接口
    public interface IWxData{

        /**
         * 獲取code
         */
        void getCode(String code);

    }

    /** APPID **/
    public String WX_APP_ID = McvApplication.WX_APP_ID;
    // IWXAPI 是第三方app和微信通信的openapi接口
    private IWXAPI api;
    private BaseResp resp = null;
    // 獲取第一步的code后,請求以下鏈接獲取access_token
    private String GetCodeRequest = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
    // 獲取用戶個人信息
    private String GetUserInfo = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID";
    private String WX_APP_SECRET = "創建應用后得到的APP_SECRET";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        api = WXAPIFactory.createWXAPI(this, WX_APP_ID, false);
        api = McvApplication.api;
        api.handleIntent(getIntent(), this);
    }

    // 微信發送請求到第三方應用時,會回調到該方法
    @Override
    public void onReq(BaseReq req) {
        finish();
    }

    // 第三方應用發送到微信的請求處理后的響應結果,會回調到該方法
    @Override
    public void onResp(BaseResp resp) {
        String result = "";
        if (resp != null) {
            resp = resp;
        }
        switch (resp.errCode) {
            case BaseResp.ErrCode.ERR_OK:
                if(resp.getType() == WE_LOGIN) {
                    result = "登錄成功";
                    Toast.makeText(this, result, Toast.LENGTH_LONG).show();
                    String code = ((SendAuth.Resp) resp).code;
//                  因為我只是獲取wechatCode 然后通過接口 將code傳到我們后台他去完成后台獲取用戶信息然后注冊返回是否成功給我,所以我就沒有用下面的getUserInfo的方法,但下面的可以用
                    mIWxData.getCode(code);
//                    /*
//                     * 將你前面得到的AppID、AppSecret、code,拼接成URL 獲取access_token等等的信息(微信)
//                     */
//                    String get_access_token = getCodeRequest(code);
//                    AsyncHttpClient client = new AsyncHttpClient();
//                    client.post(get_access_token, new JsonHttpResponseHandler() {
//                        @Override
//                        public void onSuccess(int statusCode, JSONObject response) {
//                            // TODO Auto-generated method stub
//                            super.onSuccess(statusCode, response);
//                            try {
//
//
//                                if (!response.equals("")) {
//                                    String access_token = response
//                                            .getString("access_token");
//                                    String openid = response.getString("openid");
//                                    String get_user_info_url = getUserInfo(
//                                            access_token, openid);
//                                    getUserInfo(get_user_info_url);
//                                }
//
//                            } catch (Exception e) {
//                                // TODO Auto-generated catch block
//                                e.printStackTrace();
//                            }
//                        }
//                    });
                }else if(resp.getType() == WE_SHARE){
                    result = "分享成功";
                    Toast.makeText(this, result, Toast.LENGTH_LONG).show();
                }
                finish();
                break;
            case BaseResp.ErrCode.ERR_USER_CANCEL:
                result = "取消";
                Toast.makeText(this, result, Toast.LENGTH_LONG).show();
                LoadDialog.dismiss(this);
                finish();
                break;
            case BaseResp.ErrCode.ERR_AUTH_DENIED:
                result = "登錄被拒絕";
                Toast.makeText(this, result, Toast.LENGTH_LONG).show();
                finish();
                break;
            default:
                result = "取消登錄";
                Toast.makeText(this, result, Toast.LENGTH_LONG).show();
                finish();
                break;
        }
    }

    /**
     * 通過拼接的用戶信息url獲取用戶信息
     *
     * @param user_info_url
     */
    private void getUserInfo(String user_info_url) {
        AsyncHttpClient client = new AsyncHttpClient();
        client.get(user_info_url, new JsonHttpResponseHandler() {
            @Override
            public void onSuccess(int statusCode, Header[] headers, String responseString) {
                super.onSuccess(statusCode, headers, responseString);
            }
            //            @Override
//            public void onSuccess(int statusCode, JSONObject response) {
//                // TODO Auto-generated method stub
//                super.onSuccess(statusCode, response);
//                try {
//
//                    System.out.println("獲取用戶信息:" + response);
//
//                    if (!response.equals("")) {
//                        String openid = response.getString("openid");
//                        String nickname = response.getString("nickname");
//                        String headimgurl = response.getString("headimgurl");
//
//                    }
//
//                } catch (Exception e) {
//                    // TODO Auto-generated catch block
//                    e.printStackTrace();
//                }
//            }
        });
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        api.handleIntent(intent, this);
        finish();
    }

    /**
     * 獲取access_token的URL(微信)
     *
     * @param code
     *            授權時,微信回調給的
     * @return URL
     */
    private String getCodeRequest(String code) {
        String result = null;
        GetCodeRequest = GetCodeRequest.replace("APPID",
                urlEnodeUTF8(WX_APP_ID));
        GetCodeRequest = GetCodeRequest.replace("SECRET",
                urlEnodeUTF8(WX_APP_SECRET));
        GetCodeRequest = GetCodeRequest.replace("CODE", urlEnodeUTF8(code));
        result = GetCodeRequest;
        return result;
    }

    /**
     * 獲取用戶個人信息的URL(微信)
     *
     * @param access_token
     *            獲取access_token時給的
     * @param openid
     *            獲取access_token時給的
     * @return URL
     */
    private String getUserInfo(String access_token, String openid) {
        String result = null;
        GetUserInfo = GetUserInfo.replace("ACCESS_TOKEN",
                urlEnodeUTF8(access_token));
        GetUserInfo = GetUserInfo.replace("OPENID", urlEnodeUTF8(openid));
        result = GetUserInfo;
        return result;
    }

    private String urlEnodeUTF8(String str) {
        String result = str;
        try {
            result = URLEncoder.encode(str, "UTF-8");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

}

 

5.調用的地方

/**
     * 微信登錄
     */
    private void wechatLogin() {

        if(!NetworkUtils.isnetWorkAvilable()){
            ToastUtil.showShort(this,"暫無網絡連接");
            return;
        }

//        WXapi = WXAPIFactory.createWXAPI(this, WXEntryActivity.WX_APP_ID, true);
//        WXapi.registerApp(WXEntryActivity.WX_APP_ID);
        WXapi = McvApplication.api;

        // 判斷是否安裝了微信客戶端
        if (!WXapi.isWXAppInstalled()) {
            ToastUtil.showShort(this, "您還未安裝微信客戶端!");
            return;
        }

        LoadDialog.show(this,"正在打開微信..."); //彈出框

    // 上面寫的用來獲取wechatCode的回調接口 設置進去 WXEntryActivity.setIWxData(new WXEntryActivity.IWxData() { @Override public void getCode(String code) { //請求本地微信接口 // ToastUtil.showShort(RegisterOneActivity.this,code); mLoginManager.weChatLogin(code); } }); SendAuth.Req req = new SendAuth.Req(); req.scope = "snsapi_userinfo"; req.state = "com"; WXapi.sendReq(req); }

 

6.以上是我用到的,如果有幫助就好,再次做個記錄,還要不免吐槽一下,微信開放平台文檔是什么鬼東西,寫的能看嗎?

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM