友盟集成第三方登录--微信、QQ实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/smileiam/article/details/78421265

友盟集成了第三方登录,本给我们带来便利,但是文档只描述了集成方式,出现问题,发现还得自己各种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就行,但是换成自己应用的就不行,会出下面的错误
这里写图片描述
而换成能呼起下面的页面
这里写图片描述
至于这个问题,还没有找到原因,我觉得是我们注册的应用的问题。

猜你喜欢

转载自blog.csdn.net/smileiam/article/details/78421265