android第三方登录 (微信,微博,QQ)
一 分别去新浪开放平台,微信开放平台,腾讯开放平台注册账号,填写开发者信息,创建你的应用,在你的应用信息里填写项目包名,下载签名工具生成AppKey和AppID,这些准备工作完成以后就开始我们的项目之旅。
1.新浪微博
在做新浪微博登陆的时候需要你在平台上填写几个测试账号,在项目清单文件中配置信息
把你的AppKey,REDIRECT_URL(回执url)以及SCOPE保存一下
授权界面
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中注册微信
然后发起登录请求
这里需要注意的是微信登录需要先打包签名才能向微信发起登录请求,老老实实的打包之后就是下面这个样子了
点击确认登录按钮这个时候就需要你和后台进行交互了,在项目中必须要建一个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
初始化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);
}
}
至此,三大登陆结束。