天天看點

友盟內建第三方登入--微信、QQ實作

友盟內建了第三方登入,本給我們帶來便利,但是文檔隻描述了內建方式,出現問題,發現還得自己各種baidu,這裡總結自己遇到的一些坑,以防下次再踩。

友盟內建第三方微信登入:

友盟內建方案參考:http://dev.umeng.com/social/android/login-page#1

前期工作:微信賬号開通開發者賬号權限,在https://open.weixin.qq.com/上建立自己應用,擷取到AppId和AppSecret。

1. 實作步驟

1.1 前期準備

将umeng_social_tool.jar, umeng_social_net.jar, umeng_social_api.jar三個jar包copy到工程的libs目錄下。

在應用中添權重限

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.READ_LOGS"/>
    <uses-permission android:name="android.permission.CALL_PHONE"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
           

1.2 平台配置,一般建議放在全局Application或者程式入口

{
        PlatformConfig.setWeixin(AppConstant.WEIXIN_APPID, AppConstant.WEIXIN_APPSECRET);
PlatformConfig.setQQZone(AppConstant.QQ_APPID, AppConstant.QQ_KEY);
    }
           

1.3 在應用包名.wxapi路徑下建立WXEntryActivity類,并在AndroidMainfest.xml中注冊

public class WXEntryActivity extends WXCallbackActivity {

}
           

AndroidMainfest.xml中注冊,記得android:exported設定為”true”,我就是在這吃個虧,設定成false,結果在呼起微信端登入時,點選登入,不會回調WXEntryActivity,原因應該是微信第三方登入的程序和我們應用的程序不是同一個程序。

<!--微信-->
<activity
            android:name=".wxapi.WXEntryActivity"
            android:configChanges="keyboardHidden|orientation|screenSize"
            android:exported="true"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.Translucent.NoTitleBar"/>
 <!-- tencent,記得scheme後面的數字改成自己的appId -->
        <activity
            android:name="com.umeng.qq.tencent.AuthActivity"
            android:launchMode="singleTask"
            android:noHistory="true">
            <intent-filter>
                <action android:name="android.intent.action.VIEW"/>

                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE"/>

                <data android:scheme="tencent100424468"/>
            </intent-filter>
        </activity>
        <activity
            android:name="com.umeng.qq.tencent.AssistActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.Translucent.NoTitleBar"/>
           

1.4 第三方登入實作

platform中傳入的SHARE_MEDIA.WEIXIN

private void loginByThree(SHARE_MEDIA platform) {
        UMShareAPI.get(this).doOauthVerify(this, platform, authListener);
    }

     /**
     * 第三方登入授權
     */
    UMAuthListener authListener = new UMAuthListener() {
        @Override
        public void onStart(SHARE_MEDIA platform) {
            LoadingDialog.showDialogForLoading(LoginActivity.this, getString(R.string.auth), true);
        }

        @Override
        public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) {
            LoadingDialog.cancelDialogForLoading();
            if (platform == SHARE_MEDIA.WEIXIN) {
                threeUserId = data.get("unionid");
            } else {
                threeUserId = data.get("uid");
            }
            access_token = data.get("access_token");
            UMShareAPI.get(LoginActivity.this).getPlatformInfo(LoginActivity.this, platform, getInfoAuthListener);
        }

        @Override
        public void onError(SHARE_MEDIA platform, int action, Throwable t) {
            showShortToast("失敗:" + t.getMessage());
            LoadingDialog.cancelDialogForLoading();
        }

        @Override
        public void onCancel(SHARE_MEDIA platform, int action) {
            showShortToast("取消了");
            LoadingDialog.cancelDialogForLoading();
        }
    };

    UMAuthListener getInfoAuthListener = new UMAuthListener() {
        @Override
        public void onStart(SHARE_MEDIA platform) {

        }

        @Override
        public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) {
            String temp = "";
            for (String key : data.keySet()) {
                temp = temp + key + " : " + data.get(key) + "\n";
            }
            threeUserId = data.get("uid");
            loginToServer();
        }

        @Override
        public void onError(SHARE_MEDIA platform, int action, Throwable t) {
            showShortToast("錯誤" + t.getMessage());
        }

        @Override
        public void onCancel(SHARE_MEDIA platform, int action) {
            showShortToast("取消" );
        }
    };

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data);
    }
           

2. 遇到的坑

2.1 點選微信登入時,沒有進入微信第三方頁面

需要在微信平台上,将應用的包名和簽名填入,并繳納開放登入權限的費用(300元),注意如果放的relaese簽名,在呼起WXEntryActivity應該是relase後的包。

或者你WXEntryActivity放置的位置不對,一定要在包名.wxapi路徑下

2.2 點選微信登入後,沒有回調WXEntryActivity和UMAuthListener

這可能是因為WXEntryActivity在AndroidMainfest.xml中注冊時,android:exported沒有設定成true

2.3 微信登入擷取accessToken

在UMAuthListener authListener 的onComplete回調中

@Override
        public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) {
            String access_token = data.get("access_token");
            UMShareAPI.get(LoginActivity.this).getPlatformInfo(LoginActivity.this, platform, getInfoAuthListener);
        }
           

2.4 QQ應用非官方正版應用,請去應用寶下載下傳正版後進行QQ登入(錯誤碼:100044)

其實并不是咱們的應用沒有在應用寶上傳或是正版,因為我發現在應用中換成友盟的QQ的appid和appkey就行,但是換成自己應用的就不行,會出下面的錯誤

友盟內建第三方登入--微信、QQ實作

而換成能呼起下面的頁面

友盟內建第三方登入--微信、QQ實作

至于這個問題,還沒有找到原因,我覺得是我們注冊的應用的問題。

繼續閱讀