Android 原生第三方登录

android第三方登录 (微信,微博,QQ)


一 分别去新浪开放平台,微信开放平台,腾讯开放平台注册账号,填写开发者信息,创建你的应用,在你的应用信息里填写项目包名,下载签名工具生成AppKey和AppID,这些准备工作完成以后就开始我们的项目之旅。

1.新浪微博

在做新浪微博登陆的时候需要你在平台上填写几个测试账号,在项目清单文件中配置信息
Android 原生第三方登录_第1张图片

把你的AppKey,REDIRECT_URL(回执url)以及SCOPE保存一下

Android 原生第三方登录_第2张图片

授权界面

public class WBAuthActivity extends Activity {

private static final String TAG = "weibosdk";

/** 显示认证后的信息,如 AccessToken */
private TextView mTokenText;

private AuthInfo mAuthInfo;

/** 封装了 "access_token","expires_in","refresh_token",并提供了他们的管理功能  */
private Oauth2AccessToken mAccessToken;

/** 注意:SsoHandler 仅当 SDK 支持 SSO 时有效 */
private SsoHandler mSsoHandler;

/** 注销操作回调 */
public LogOutRequestListener mLogoutRequestListener = new LogOutRequestListener();

public SinaUserInfo userInfo;

private  TextView userinfo_tv;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_auth);

    // 获取 Token View,并让提示 View 的内容可滚动(小屏幕可能显示不全)
    mTokenText = (TextView) findViewById(R.id.token_text_view);
    TextView hintView = (TextView) findViewById(R.id.obtain_token_hint);
    hintView.setMovementMethod(new ScrollingMovementMethod());
    userinfo_tv= (TextView) findViewById(R.id.userinfo_tv);

    // 创建微博实例
    // 快速授权时,请不要传入 SCOPE,否则可能会授权不成功
    mAuthInfo = new AuthInfo(this, Constants.APP_KEY, Constants.REDIRECT_URL, Constants.SCOPE);
    mSsoHandler = new SsoHandler(WBAuthActivity.this, mAuthInfo);

    // SSO 授权, 仅客户端
    findViewById(R.id.obtain_token_via_sso).setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
          mSsoHandler.authorizeClientSso(new AuthListener());
        }
    });

/**
* 微博认证授权回调类。
* 1. SSO 授权时,需要在 {@link #onActivityResult} 中调用 {@link SsoHandler#authorizeCallBack} 后,
* 该回调才会被执行。
* 2. 非 SSO 授权时,当授权结束后,该回调就会被执行。
* 当授权成功后,请保存该 access_token、expires_in、uid 等信息到 SharedPreferences 中。
*/
class AuthListener implements WeiboAuthListener {

    @Override
    public void onComplete(Bundle values) {
        // 从 Bundle 中解析 Token
        mAccessToken = Oauth2AccessToken.parseAccessToken(values);
        //从这里获取用户输入的 电话号码信息 
        String phoneNum =  mAccessToken.getPhoneNum();

        if (mAccessToken.isSessionValid()) {
            // 显示 Token
            updateTokenView(false);
            // 保存 Token 到 SharedPreferences
            AccessTokenKeeper.writeAccessToken(WBAuthActivity.this, mAccessToken);
            Toast.makeText(WBAuthActivity.this, R.string.weibosdk_demo_toast_auth_success, Toast.LENGTH_SHORT).show();

            //获取用户资料(userid,用户名,头像)
            new Thread(new Runnable() {
                @Override
                public void run() {

                    UsersAPI usersAPI=new UsersAPI(WBAuthActivity.this,Constants.APP_KEY,mAccessToken);
                    usersAPI.show(Long.valueOf(mAccessToken.getUid()),new SinaRequestListener());

                }
            }).start();

        } else {
            // 以下几种情况,您会收到 Code:
            // 1. 当您未在平台上注册的应用程序的包名与签名时;
            // 2. 当您注册的应用程序包名与签名不正确时;
            // 3. 当您在平台上注册的包名和签名与您当前测试的应用的包名和签名不匹配时。
            String code = values.getString("code");
            String message = getString(R.string.weibosdk_demo_toast_auth_failed);
            if (!TextUtils.isEmpty(code)) {
                message = message + "\nObtained the code: " + code;
            }
            Toast.makeText(WBAuthActivity.this, message, Toast.LENGTH_LONG).show();
        }
    }

    @Override
    public void onCancel() {
        Toast.makeText(WBAuthActivity.this, R.string.weibosdk_demo_toast_auth_canceled, Toast.LENGTH_LONG).show();
    }

    @Override
    public void onWeiboException(WeiboException e) {
        Toast.makeText(WBAuthActivity.this, "Auth exception : " + e.getMessage(), Toast.LENGTH_LONG).show();
    }
}

public class SinaRequestListener implements RequestListener{ //新浪微博请求用户信息接口
@Override
public void onComplete(String response){
try{
JSONObject jsonObject=new JSONObject(response);
String idStr= jsonObject.getString(“idstr”);// 唯一标识符(uid)
String name= jsonObject.getString(“name”);// 姓名
String avatarHd=jsonObject.getString(“avatar_hd”);// 头像
userInfo=new SinaUserInfo();
userInfo.setUid(idStr);
userInfo.setName(name);
userInfo.setAvatarHd(avatarHd);
Message message=Message.obtain();
message.what=1;handler.sendMessage(message);
}catch(JSONException e){// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void onWeiboException(WeiboException e)
{// TODO Auto-generated method stubToast.makeText(context, “Auth exception : ” + e.getMessage(),Toast.LENGTH_LONG).show();
Log.i(“mylog”,”Auth exception : “+e.getMessage());
}
}

//得到用户信息
public Handler handler=new Handler(){
public void handleMessage(Message msg){
if(msg.what==1){
userinfo_tv.setText(“用户id:”+userInfo.getUid()+”\n”+”用户名:”+userInfo.getName()+”\n”+”用户头像url:”+userInfo.getAvatarHd());
}
};
};

2.微信登录

微信登录用微信原生SDK比较坑(还要向微信交300元/年),从微信平台上下载的Demo没有任何卵用,公司后台哥们配置的时候也吐槽,事实说明改变不了就接受微信的无耻吧! ()

把微信jar包导入,在Application中注册微信

Android 原生第三方登录_第3张图片

清单文件配置
Android 原生第三方登录_第4张图片

然后发起登录请求

Android 原生第三方登录_第5张图片

这里需要注意的是微信登录需要先打包签名才能向微信发起登录请求,老老实实的打包之后就是下面这个样子了

Android 原生第三方登录_第6张图片

点击确认登录按钮这个时候就需要你和后台进行交互了,在项目中必须要建一个wxapi的包,新建一个WXEntryActivity。

public class WXEntryActivity extends Activity implements IWXAPIEventHandler{
。。。。。。
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_wx);

    MyApp.api.handleIntent(getIntent(), this); //这一步必须要写

}

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    Log.i(TAG, "onNewIntent");
    // setIntent(intent);
    MyApp.api.handleIntent(intent, this); //必须要写
}

/**
 * 请求回调接口,不做操作
 */
@Override
public void onReq(BaseReq req) {
    Log.i(TAG, "onReq");
}

/**
* 请求响应回调接口(这个才是关键)
*/
@Override
public void onResp(BaseResp resp) {

    String result = "";
    switch (resp.errCode) {
        case BaseResp.ErrCode.ERR_OK:
            String code = ((SendAuth.Resp) resp).code;
            //获取AppToken
            getAppToken(code);
            break;
        case BaseResp.ErrCode.ERR_USER_CANCEL:
            result = "发送取消";
            Toast.makeText(this, result, Toast.LENGTH_LONG).show();
            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;
    }
}

由于公司采用oAuthor2.0认证,所以先得到appToken,然后得到登录授权,每家公司要求不太一样,所以最终拿到openId才是最终目的,根据openId就能得到用户信息了。

3.QQ登录

和微博的过程大致一样,清单文件中要在qq授权Activity填写appId

Android 原生第三方登录_第7张图片

初始化Tencent实例

Tencent mTencent= mTencent = Tencent.createInstance(mAppid, this);

发起登录

mTencent.login(this, “all”, loginListener);

登录监听 loginListener

//登录点击事件
IUiListener loginListener = new BaseUiListener() {
@Override
protected void doComplete(JSONObject values) {
Log.d(“SDKQQAgentPref”, “AuthorSwitch_SDK:” + SystemClock.elapsedRealtime());
initOpenidAndToken(values);

        //得到用户头像和ID
        updateUserInfo();
      //登录按钮状态切换
        updateLoginButton();
    }
};

private void updateUserInfo() {
if (mTencent != null && mTencent.isSessionValid()) {
IUiListener listener = new IUiListener() {

            @Override
            public void onError(UiError e) {

            }

            @Override
            public void onComplete(final Object response) {
                Message msg = new Message();
                msg.obj = response;
                msg.what = 0;
                mHandler.sendMessage(msg);
                new Thread(){

                    @Override
                    public void run() {
                        JSONObject json = (JSONObject)response;
                        if(json.has("figureurl")){
                            Bitmap bitmap = null;
                            try {

                                //用户头像
                                bitmap = Util.getbitmap(json.getString("figureurl_qq_2"));
                            } catch (Exception e) {

                            }
                            Message msg = new Message();
                            msg.obj = bitmap;
                            msg.what = 1;
                            mHandler.sendMessage(msg);
                        }
                    }

                }.start();
            }

            @Override
            public void onCancel() {

            }
        };
        mInfo = new UserInfo(this, mTencent.getQQToken());
        mInfo.getUserInfo(listener);

    } else {
        mUserInfo.setText("");
        mUserInfo.setVisibility(View.GONE);
        mUserLogo.setVisibility(View.GONE);
    }
}

至此,三大登陆结束。

你可能感兴趣的:(Android开发)