android接入原生第三方登录(微信登录、QQ登录、新浪微博登录)
2015-11-18 10:27
841 查看
第一步:去对应的平台上注册app的相关信息,这一步,可参考我的另外一个篇,关于接入亲加通信云的文章 各个平台注册应用信息的地址如下: 新浪微博 http://open.weibo.com 腾讯微博 http://dev.t.qq.com QQ空间 http://connect.qq.com/intro/login/ 微信好友 http://open.weixin.qq.com Facebook https://developers.facebook.com Twitter https://dev.twitter.com 人人网 http://dev.renren.com 开心网 http://open.kaixin001.com 搜狐微博 http://open.t.sohu.com 网易微博 http://open.t.163.com 豆瓣 http://developers.douban.com 有道云笔记 http://note.youdao.com/open/developguide.html#app 印象笔记 https://dev.evernote.com/ Linkedin https://www.linkedin.com/secure/developer?newapp= FourSquare https://developer.foursquare.com/ 搜狐随身看 https://open.sohu.com/ Flickr http://www.flickr.com/services/ Pinterest http://developers.pinterest.com/ Tumblr http://www.tumblr.com/developers Dropbox https://www.dropbox.com/developers Instagram http://instagram.com/developer# VKontakte http://vk.com/dev
新浪微博登录:
主要流程:APP客户端发起登录,会回调在WeiboAuthListener 当中,在这里面我们可以得到UID(身份唯一标识),得到UID之后,再通过UsersAPI.show(UID,RequestListener )来得到用户的信息,回调在RequestListener 当中。有些手机没有安装新浪微博客户端,有些则安装了客户端,所以为了统一,我这里采用的是没有安装客户端的代码,通过非SSO授权登录1. 官网注册Appkey (下载jar包,新浪微博的为一个WeiboSDK的工程)2、配置XML:在MainFest文件中加入以下代码片段<!-- 微博 --> <!-- 必须注册在微博授权,分享微博时候用到 --> <activity android:name= "com.sina.weibo.sdk.component.WeiboSdkBrowser" android:configChanges= "keyboardHidden|orientation" android:exported= "false" android:windowSoftInputMode="adjustResize" > </activity > <service android:name= "com.sina.weibo.sdk.net.DownloadService" android:exported= "false" > </service >3、java代码中登录
//注册成功之后的APPKEY public static final String SINA_APPKEY = "2651314935"; //注册成功之后的REDIRECT_URL public static final String SINA_REDIRECT_URL = "https://api.weibo.com/oauth2/default.html" ; public static final String SINA_SCOPE = "all"; /** 注意:SsoHandler 仅当 SDK 支持 SSO 时有效 */ private SsoHandler mSsoHandler; private AuthInfo mAuthInfo; private Oauth2AccessToken mAccessToken; mAuthInfo = new AuthInfo(LoginActivity. this, APPConstants. SINA_APPKEY, APPConstants.SINA_REDIRECT_URL , APPConstants. SINA_SCOPE); mSsoHandler = new SsoHandler(LoginActivity. this, mAuthInfo); mSsoHandler.authorize( new AuthListener()); /******************************** 微博回调 ***********************************************/ /** * 微博认证授权回调类。 1. SSO 授权时,需要在 {@link #onActivityResult} 中调用 * {@link SsoHandler#authorizeCallBack} 后, 该回调才会被执行。 2. 非 SSO * 授权时,当授权结束后,该回调就会被执行。 当授权成功后,请保存该 access_token、expires_in、uid 等信息到 * SharedPreferences 中。 */ public class AuthListener implements WeiboAuthListener { @Override public void onComplete(Bundle values) { // 从 Bundle 中解析 Token mAccessToken = Oauth2AccessToken.parseAccessToken(values); if ( mAccessToken.isSessionValid()) { MyProgressDialog. showDialogWithFalse(LoginActivity.this, "登陆", "正在获取用户信息" ); thirdUser = new ThirdUserInfo(); thirdUser.setThirdID( mAccessToken.getUid()); //mAccessToken.getUid() ,获取到UID,作为身份的唯一标示 UsersAPI mUsersAPI = new UsersAPI(LoginActivity.this,APPConstants.SINA_APPKEY , mAccessToken ); long uid = Long.parseLong(mAccessToken.getUid()); mUsersAPI.show(uid, mListener); //获取用户基本信息 } else { // 以下几种情况,您会收到 Code: // 1. 当您未在平台上注册的应用程序的包名与签名时; // 2. 当您注册的应用程序包名与签名不正确时; // 3. 当您在平台上注册的包名和签名与您当前测试的应用的包名和签名不匹配时。 // String code = values.getString("code"); } } @Override public void onCancel() { } @Override public void onWeiboException(WeiboException e) { } }
//获取用户信息的回调 private RequestListener mListener = new RequestListener() { @Override public void onComplete(String response) { if (!TextUtils. isEmpty(response)) { // 调用 User#parse 将JSON串解析成User对象,所有的用户信息全部在这里面 User user = User. parse(response); thirdUser.setNickName(user. name); // 昵称 thirdUser.setIcon(user. avatar_hd); // 头像 thirdUser.setGender(user. gender.equals( "m") ? "男" : "女" ); ThirdUserVerify. verifyUser(LoginActivity.this, thirdUser, 2); } } @Override public void onWeiboException(WeiboException e) { MyProgressDialog. closeDialog(); ErrorInfo info = ErrorInfo. parse(e.getMessage()); ToastUtil. showShort(LoginActivity.this, info.toString()); } }; @Override protected void onActivityResult( int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if ( mSsoHandler != null) { mSsoHandler.authorizeCallBack(requestCode, resultCode, data); } }
微信登录
先说一下主主要流程:客户端发起登录--在WXEntryActivity的onResp(BaseResp arg0)方法中进行回调,会得到一个code.通过这个code调用一个接口获取到token和OpenID的值,之后再通过token以及openID调用获取用户信息的接口-来获取用户的数据1、注册APPKEY2、配置xml文件,在MainFest文件中添加以下代码: <!-- 因为微信的回调是必须写一个wxapi.WXEntryActivity的类。回调在此类,前面的包名为项目的包名--> <activity [align=left] android:name= "com.spapa.papapaiming.wxapi.WXEntryActivity" [/align][align=left] android:exported= "true" />[/align][align=left][/align][align=left]3、发起登陆 (我在我的application类中,定义了一个static 的 IWXAPI)[/align]BaseApplication. mIwapi = WXAPIFactory.createWXAPI( LoginActivity. this, APPConstants.WX_APPID, true ); BaseApplication. mIwapi.registerApp(APPConstants. WX_APPID); SendAuth.Req req = new SendAuth.Req(); req. scope = "snsapi_userinfo"; req. state = "wechat_sdk_demo_test"; BaseApplication. mIwapi.sendReq(req);//执行完毕这句话之后,会在WXEntryActivity回调[align=left]4.WXEntryActivity类(回调类)[/align]
public class WXEntryActivity extends Activity implements IWXAPIEventHandler { private Bundle bundle; //这个实体类是我自定义的实体类,用来保存第三方的数据的实体类 private ThirdUserInfo info= null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); AppManager. getAppManager().addActivity(WXEntryActivity. this); BaseApplication. mIwapi.handleIntent(getIntent(), WXEntryActivity.this); //必须调用此句话 } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); BaseApplication. mIwapi.handleIntent(intent, WXEntryActivity.this);//必须调用此句话 } @Override public void onReq(BaseReq req) { System. out.println(); } /** * Title: onResp * * API:https://open.weixin.qq.com/ cgi- bin/showdocument ?action=dir_list&t=resource/res_list&verify=1&id=open1419317853 &lang=zh_CN * Description:在此处得到Code之后调用https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code * 获取到token和openID。之后再调用https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID 获取用户个人信息 * * @param arg0 * @see com.tencent.mm.sdk.openapi.IWXAPIEventHandler#onResp(com.tencent.mm.sdk.openapi.BaseResp) */ @Override public void onResp(BaseResp arg0) { bundle=getIntent().getExtras(); SendAuth.Resp resp = new SendAuth.Resp( bundle); //获取到code之后,需要调用接口获取到access_token if (resp. errCode == BaseResp.ErrCode. ERR_OK) { String code = resp. token; if(BaseApplication. isWxLogin){ getToken(code); } else{ WXEntryActivity. this.finish(); } } else{ WXEntryActivity. this.finish(); } } //这个方法会取得accesstoken 和openID private void getToken(String code){ MyProgressDialog. showDialog(WXEntryActivity.this, "登陆", "正在获取用户信息" ); HttpBase. get("https://api.weixin.qq.com/sns/oauth2/access_token?appid=wxd7673d08f6c1963d&secret=223d726f966031f30125d0e4e7d4aed3&code=" +code+"&grant_type=authorization_code" , new JsonHttpResponseHandler(){ @Override public void onSuccess( int statusCode, JSONObject response) { super.onSuccess(statusCode, response); info = new ThirdUserInfo(); info.setThirdID(response.optString( "openid")); getUserInfo(response.optString( "access_token"),response.optString( "openid")); } @Override public void onFailure( int statusCode, Throwable e, JSONObject errorResponse) { // TODO Auto-generated method stub super.onFailure(statusCode, e, errorResponse); MyProgressDialog. closeDialog(); HttpBase. onFailureTips(WXEntryActivity.this, errorResponse); } }); } //获取到token和openID之后,调用此接口得到身份信息 private void getUserInfo(String token,String openID){ HttpBase. get("https://api.weixin.qq.com/sns/userinfo?access_token=" +token+"&openid=" +openID, new JsonHttpResponseHandler(){ @Override public void onSuccess( int statusCode, JSONObject response) { super.onSuccess(statusCode, response); info.setNickName(response.optString( "nickname")); info.setGender(response.optInt( "sex")==1? "男": "女"); info.setIcon(response.optString( "headimgurl")); ThirdUserVerify. verifyUser(WXEntryActivity.this, info, 3); // AppManager.getAppManager().finishActivity(LoginActivity.class); } @Override public void onFailure( int statusCode, Throwable e, JSONObject errorResponse) { super.onFailure(statusCode, e, errorResponse); MyProgressDialog. closeDialog(); HttpBase. onFailureTips(WXEntryActivity.this, errorResponse); } }); } }
QQ登录
1、注册APPKEY2、配置xml文件:<!-- QQ --> <activity android:name= "com.tencent.tauth.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 ="1104406273" /> </intent-filter > </activity > <activity android:name= "com.tencent.connect.common.AssistActivity" android:configChanges="orientation|keyboardHidden|screenSize" android:theme= "@android:style/Theme.Translucent.NoTitleBar" />
<span style="white-space:pre"> </span>
//初始化Tencentpublic Tencent mTencent = Tencent.createInstance(APPConstants. QQ_APPID,LoginActivity.this);// QQ发起登陆mTencent.login(LoginActivity. this, "all", new IUiListener() {@Overridepublic void onCancel() {}@Overridepublic void onComplete(Object arg0) {//登陆成功的回调,在此处可以获取用户信息MyProgressDialog. showDialogWithFalse(LoginActivity.this, "登陆", "正在获取用户信息" );initOpenidAndToken((JSONObject) arg0);updateUserInfo();}@Overridepublic void onError(UiError arg0) {}});/*** @Title: initOpenidAndToken* @Description: 初始化OPENID以及TOKEN身份验证。* @param @param jsonObject* @return void* @throws*/private void initOpenidAndToken (JSONObject jsonObject) {thirdUser = new ThirdUserInfo();try {//这里的Constants类,是 com.tencent.connect.common.Constants类,下面的几个参数也是固定的String token = jsonObject.getString(Constants.PARAM_ACCESS_TOKEN );String expires = jsonObject.getString(Constants.PARAM_EXPIRES_IN );//OPENID,作为唯一身份标识String openId = jsonObject.getString(Constants.PARAM_OPEN_ID );if (!TextUtils. isEmpty(token) && !TextUtils.isEmpty(expires)&& !TextUtils. isEmpty(openId)) {//设置身份的tokenmTencent.setAccessToken(token, expires);mTencent.setOpenId(openId);thirdUser.setThirdID(openId);}} catch (Exception e) {}}/*** @Title: updateUserInfo* @Description: 在回调里面可以获取用户信息数据了* @param* @return void* @throws*/private void updateUserInfo() {if ( mTencent != null && mTencent.isSessionValid()) {UserInfo mInfo = new UserInfo(LoginActivity. this, mTencent.getQQToken());mInfo.getUserInfo(listener);IUiListener listener = new IUiListener() {@Overridepublic void onError(UiError e) {MyProgressDialog. closeDialog();}// 用户的信息回调在此处@Overridepublic void onComplete( final Object response) {// 返回Bitmap对象。try {JSONObject obj = new JSONObject(response.toString());thirdUser.setNickName(obj.optString( "nickname"));thirdUser.setIcon(obj.optString( "figureurl_qq_2"));thirdUser.setGender(obj.optString( "gender"));ThirdUserVerify. verifyUser(LoginActivity.this,thirdUser, 1);} catch (JSONException e) {e.printStackTrace();}}@Overridepublic void onCancel() {MyProgressDialog. closeDialog();}};}}[align=left][/align]
相关文章推荐
- js如何调用qq互联api实现第三方登录
- qq登录,新浪微博登录接口申请过程中遇到的问题
- 微信开放平台之网站授权微信登录功能
- 关于使用微信登录第三方APP的实现(Android版)
- joomlaQQ登录
- 实现QQ的第三方登录 iOS开发
- 第三方登录
- 微信登录开发-java
- iOS客户端三方登录的封装
- Android之微信接入分享,登录功能。
- 第三方App接入微信登录 解读
- iOS集成ShareSKD第三方登录
- 集成微信第三方登录功能获取微信用户信息
- 小程序思维导图,让小程序不再难懂(二)
- 用 java 做网页版微信登录
- oAuth 2.0 第三方登录详细介绍(github)
- 第三方登录功能分享&第三方登录模块开发(iOS)
- JS_SDK实现QQ第三方登录
- 用户中心功能设计快速整合第三方微信或微信公共号授权
- Java实现微信网页授权