Android三方登陆之QQ,微信,微博登录及注意事项

简介

在我们的应用中,一般都有三方登录这个功能,对于这个常用的功能,我们一般会有如下处理方式

  • 导入三方sdk,按照文档开发
  • 使用如ShareSDK类三方组件来实现

ShareSDK

官方Demo: ThirdPartyLoginDemo
这个参照官方文档一步步的来,也是非常的简单.主要分为两步,
第一步,授权,第二步,获取用户资料

授权:

Platform weibo = ShareSDK.getPlatform(SinaWeibo.NAME);
weibo.setPlatformActionListener(paListener);
weibo.authorize();
//移除授权
//weibo.removeAccount(true);

调用authorize方法,会弹出一个基于ShareSDKUIShell的授权页面,填写账号和密码以后,会执行授权操作。这个方法的操作回调paListener并不实际带回什么数据,只是通过回调告知外部成功或者失败。

同时,这里也是需要修改assets目录下的ShareSDK.xml

获取用户资料:

上面只是完成了授权操作,但是并不会带回 实际的数据,那么一般我们都是需要带回用户的第三方信息的,那么这里就不是调用authorize(),而是showUser(null)

Platform weibo = ShareSDK.getPlatform(SinaWeibo.NAME);
weibo.setPlatformActionListener(paListener);
weibo.showUser(null);//获取用户资料

这里传递了一个paListener.授权回调,在回调中封装了用户的相关资料信息,拿到了用户信息后就好办了.

void onComplete(Platform platform, int action, HashMap<String, Object> res);
void onError(Platform platform, int action, Throwable t);
void onCancel(Platform platform, int action);

注意事项

  • SSO (Single Sign-On)
    SSO授权方式,简单来说就是优先使用目标平台客户端来完成授权。
Platform weibo = ShareSDK.getPlatform(SinaWeibo.NAME);
weibo.SSOSetting(false);  //设置false表示使用SSO授权方式
  • 自定义授权界面

ShareSDK三方登陆
当看到上面的powered by ShareSDK的时候,有些产品是需要去掉的,那么怎么办呢,答案在这里:
bbs.mob.com/thread-114-1-1.html

  • 删除授权信息

在使用ShareSDK三方登陆 的时候,会先判断是否已经完成授权,若已经完成授权,则会直接登陆,这时候如果用户想要切换一个账号.那么就只有清空数据了,这时候就可以用一个方法来清除用户授权信息

Platform qzone = ShareSDK.getPlatform(this, QZone.NAME);
qzone.removeAccount();

官方sdk

除了使用ShareSDK之外,使用官方sdk实现三方登陆也是很不错的选择.

QQ

根据官方文档的介绍一步步的来

  • 首先到[QQ互联]创建应用获取appidappkey
  • 下载SDK,将jar导入项目.
  • 修改Manifest 清单文件.
  • 调用登陆接口,获取用户数据.
// Tencent类是SDK的主要实现类,开发者可通过Tencent类访问腾讯开放的OpenAPI。

// 其中APP_ID是分配给第三方应用的appid,类型为String。

mTencent = Tencent.createInstance(APP_ID, this.getApplicationContext());

// 1.4版本:此处需新增参数,传入应用程序的全局context,可通过activity的getApplicationContext方法获取

//login ,BaseUiListener 回调中获取token
mTencent.login(activity, "all", new BaseUiListener(activity))
//根据token,获取用户信息
 UserInfo userInfo = new UserInfo(context, mTencent.getQQToken());
        userInfo.getUserInfo(new BaseUiListener(activity));

注意事项,QQ登录中需要先获取Token,然后根据Token获取UserInfo,并且需要重写onActivityResult方法才能回调

微博

  • 在微博开放平台创建应用,并获取appid
  • 下载sdk,将jar 包和so文件导入工程
  • 调用登陆接口,获取用户数据
      // 快速授权时,请不要传入 SCOPE,否则可能会授权不成功
      AuthInfo mAuthInfo = new AuthInfo(activity, wbAppKey, wbRedirectUrl, wbScope);
      mSsoHandler = new SsoHandler(activity, mAuthInfo);

      //login,AuthListener回调
      mSsoHandler.authorize(new AuthListener());
//根据token,获取用户信息
          UsersAPI mUserAPI = new UsersAPI(activity, wbAppKey, mAccessToken);

          long uid = Long.parseLong(mAccessToken.getUid());// 获取openid

          mUserAPI.show(uid, mListener);

注意事项,微博sso登录需要重写onActivityResult方法

微信

  • 在微信官方平台创建应用,获取appid
  • 下载sdk,并导入jar包,
  • 新建wxapi/WXEntryActivity,微信登陆回调类
  • 编辑Manifest添加回调Activity
  • 编写代码微信授权
    // 微信相关
    public static IWXAPI api;

    // 注册到微信
    private void rigistWeixin() {
        api = WXAPIFactory.createWXAPI(this,Constants.APP_ID);
        api.registerApp(Constants.APP_ID);
    }

    // 微信登陆请求
    private void weiXinLogin() {
        //判断微信是否安装
        if (api.isWXAppInstalled() && api.isWXAppSupportAPI()) {
            SendAuth.Req req = new SendAuth.Req();
            req.scope = "snsapi_userinfo";
            req.state = "wechat_sdk_demo_Drug A-Z";
            api.sendReq(req);//第三方发送消息给微信。
        } else {
            UIUtil.showToastSafe("没有安装微信");
        }
    }
//获取微信用户信息
/**
   * 授权登录,成功后会回调该方法
   */
  @Override public void onResp(BaseResp resp) {
    switch (resp.errCode) {
      case BaseResp.ErrCode.ERR_OK:
        if (resp.getType() == TYPE_LOGIN) {
          if (resp instanceof SendAuth.Resp) {
            final String code = ((SendAuth.Resp) resp).code;

            ThreadManager.getShortPool().execute(new Runnable() {
              @Override public void run() {
                WeixinTokenModel accessToken =
                    WechatApiService.getAccessToken(LoginBlock.getInstance().getWechatAppId(),
                        LoginBlock.getInstance().getWechatAppSecret(), code);

                if (null != sILoginCallback) sILoginCallback.tokeCallBack(accessToken);

                if (null != accessToken) {
                  WeixinInfoModel wechatUserInfo =
                      WechatApiService.getWechatUserInfo(accessToken.access_token,
                          accessToken.openid);

                  if (null != sILoginCallback) sILoginCallback.infoCallBack(wechatUserInfo);
                }
              }
            });
          }
        }

        break;
      case BaseResp.ErrCode.ERR_USER_CANCEL:
        //取消
        if (resp.getType() == TYPE_LOGIN) {
          if (resp instanceof SendAuth.Resp && null != sILoginCallback) {
            sILoginCallback.onCancel();
          }
        }
        break;
      case BaseResp.ErrCode.ERR_AUTH_DENIED:
        // 拒绝
      default:
        //失败
        if (resp.getType() == TYPE_LOGIN) {
          if (resp instanceof SendAuth.Resp && null != sILoginCallback) {
            sILoginCallback.onError(new Exception(resp.errStr));
          }
        }
        break;
    }
    finish();
  }

封装

最后,根据上面SDK封装的ShareLoginPay,包含三方登录,三方分享和三方支付,只需要配置一下 appid等基本信息即可,

//微信登录为例
private LoginManager mLoginManager = LoginManager.INSTANCE;

 mLoginManager.loginClass(WeiXinLogin.class).loginCallback(new ILoginCallback() {
      @Override public void tokeCallBack(Object o) {
        final WeixinTokenModel tokenModel = (WeixinTokenModel) o;
        runOnUiThread(new Runnable() {
          @Override public void run() {
            Toast.makeText(MainActivity.this, tokenModel.toString(), Toast.LENGTH_SHORT).show();
          }
        });
      }

      @Override public void infoCallBack(Object o) {
        final WeixinInfoModel infoModel = (WeixinInfoModel) o;
        runOnUiThread(new Runnable() {
          @Override public void run() {
            Toast.makeText(MainActivity.this, infoModel.toString(), Toast.LENGTH_SHORT).show();
          }
        });
      }

      @Override public void onError(final Exception e) {
        runOnUiThread(new Runnable() {
          @Override public void run() {
            Toast.makeText(MainActivity.this, "onError()--->" + e.getMessage(), Toast.LENGTH_SHORT)
                .show();
          }
        });
      }

      @Override public void onCancel() {
        runOnUiThread(new Runnable() {
          @Override public void run() {
            Toast.makeText(MainActivity.this, "onCancel()", Toast.LENGTH_SHORT).show();
          }
        });
      }
    }).doLogin(this);
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值