android接入原生第三方登录(微信登录、QQ登录、新浪微博登录)

时间:2021-11-01 21:29:48

第一步:去对应的平台上注册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文件中加入以下代码片段[html] view plain copy
  1. <!-- 微博 -->  
  2.   
  3.   
  4. <!-- 必须注册在微博授权,分享微博时候用到 -->  
  5. <activity  
  6.     android:name"com.sina.weibo.sdk.component.WeiboSdkBrowser"  
  7.     android:configChanges"keyboardHidden|orientation"  
  8.     android:exported"false"  
  9.     android:windowSoftInputMode="adjustResize" >  
  10. </activity >  
  11.   
  12. <service  
  13.     android:name"com.sina.weibo.sdk.net.DownloadService"  
  14.     android:exported"false" >  
  15. </service >  

3、java代码中登录
[java] view plain copy
  1. //注册成功之后的APPKEY  
  2.    public static final String SINA_APPKEY = "2651314935";  
  3.   //注册成功之后的REDIRECT_URL  
  4.    public static final String SINA_REDIRECT_URL = "https://api.weibo.com/oauth2/default.html" ;  
  5.    public static final String SINA_SCOPE = "all";  
  6.       /** 注意:SsoHandler 仅当 SDK 支持 SSO 时有效 */  
  7.    private SsoHandler mSsoHandler;  
  8.    private AuthInfo mAuthInfo;  
  9.    private Oauth2AccessToken mAccessToken;  
  10.   
  11.    mAuthInfo = new AuthInfo(LoginActivity. this,  
  12.                            APPConstants. SINA_APPKEY, APPConstants.SINA_REDIRECT_URL ,  
  13.                            APPConstants. SINA_SCOPE);  
  14.                 mSsoHandler = new SsoHandler(LoginActivity. this, mAuthInfo);  
  15.                 mSsoHandler.authorize( new AuthListener());  
  16.   
  17.   
  18.   
  19.    /******************************** 微博回调 ***********************************************/  
  20.    /** 
  21.     * 微博认证授权回调类。 1. SSO 授权时,需要在 {@link #onActivityResult} 中调用 
  22.     * {@link SsoHandler#authorizeCallBack} 后, 该回调才会被执行。 2. 非 SSO 
  23.     * 授权时,当授权结束后,该回调就会被执行。 当授权成功后,请保存该 access_token、expires_in、uid 等信息到 
  24.     * SharedPreferences 中。 
  25.     */  
  26.    public class AuthListener implements WeiboAuthListener {  
  27.   
  28.           @Override  
  29.           public void onComplete(Bundle values) {  
  30.                 // 从 Bundle 中解析 Token  
  31.                 mAccessToken = Oauth2AccessToken.parseAccessToken(values);  
  32.                 if ( mAccessToken.isSessionValid()) {  
  33.                      MyProgressDialog. showDialogWithFalse(LoginActivity.this"登陆",  
  34.                                   "正在获取用户信息" );  
  35.                       thirdUser = new ThirdUserInfo();  
  36.                       thirdUser.setThirdID( mAccessToken.getUid());  //mAccessToken.getUid() ,获取到UID,作为身份的唯一标示  
  37.                      UsersAPI mUsersAPI = new UsersAPI(LoginActivity.this,APPConstants.SINA_APPKEY , mAccessToken );  
  38.                       long uid = Long.parseLong(mAccessToken.getUid());  
  39.                      mUsersAPI.show(uid, mListener); //获取用户基本信息  
  40.                } else {  
  41.                       // 以下几种情况,您会收到 Code:  
  42.                       // 1. 当您未在平台上注册的应用程序的包名与签名时;  
  43.                       // 2. 当您注册的应用程序包名与签名不正确时;  
  44.                       // 3. 当您在平台上注册的包名和签名与您当前测试的应用的包名和签名不匹配时。  
  45.                       // String code = values.getString("code");  
  46.                }  
  47.          }  
  48.   
  49.           @Override  
  50.           public void onCancel() {  
  51.          }  
  52.   
  53.           @Override  
  54.           public void onWeiboException(WeiboException e) {  
  55.   
  56.          }  
  57.    }  
  58.     
[java] view plain copy
  1. //获取用户信息的回调  
  2. private RequestListener mListener = new RequestListener() {  
  3.        @Override  
  4.        public void onComplete(String response) {  
  5.              if (!TextUtils. isEmpty(response)) {  
  6.                    // 调用 User#parse 将JSON串解析成User对象,所有的用户信息全部在这里面  
  7.                   User user = User. parse(response);  
  8.                    thirdUser.setNickName(user. name); // 昵称  
  9.                    thirdUser.setIcon(user. avatar_hd); // 头像  
  10.                    thirdUser.setGender(user. gender.equals( "m") ? "男" : "女" );  
  11.                   ThirdUserVerify. verifyUser(LoginActivity.this, thirdUser, 2);  
  12.             }  
  13.       }  
  14.   
  15.        @Override  
  16.        public void onWeiboException(WeiboException e) {  
  17.             MyProgressDialog. closeDialog();  
  18.             ErrorInfo info = ErrorInfo. parse(e.getMessage());  
  19.             ToastUtil. showShort(LoginActivity.this, info.toString());  
  20.       }  
  21. };  
  22.   
  23. @Override  
  24. protected void onActivityResult( int requestCode, int resultCode, Intent data) {  
  25.        super.onActivityResult(requestCode, resultCode, data);  
  26.        if ( mSsoHandler != null) {  
  27.              mSsoHandler.authorizeCallBack(requestCode, resultCode, data);  
  28.       }  
  29. }  

微信登录

先说一下主主要流程:客户端发起登录--在WXEntryActivity的onResp(BaseResp arg0)方法中进行回调,会得到一个code.通过这个code调用一个接口获取到token和OpenID的值,之后再通过token以及openID调用获取用户信息的接口-来获取用户的数据

1、注册APPKEY2、配置xml文件,在MainFest文件中添加以下代码: <!-- 因为微信的回调是必须写一个wxapi.WXEntryActivity的类。回调在此类,前面的包名为项目的包名-->        <activity              android:name= "com.spapa.papapaiming.wxapi.WXEntryActivity"             android:exported= "true" />
3、发起登陆 (我在我的application类中,定义了一个static 的 IWXAPI)
[java] view plain copy
  1. BaseApplication. mIwapi = WXAPIFactory.createWXAPI( LoginActivity. this, APPConstants.WX_APPID, true );  
  2.  BaseApplication. mIwapi.registerApp(APPConstants. WX_APPID);  
  3.  SendAuth.Req req = new SendAuth.Req();  
  4.  req. scope = "snsapi_userinfo";  
  5.  req. state = "wechat_sdk_demo_test";  
  6.  BaseApplication. mIwapi.sendReq(req);//执行完毕这句话之后,会在WXEntryActivity回调  


4.WXEntryActivity类(回调类)
[java] view plain copy
  1. public class WXEntryActivity extends Activity implements IWXAPIEventHandler {  
  2.       private Bundle bundle;  
  3.       //这个实体类是我自定义的实体类,用来保存第三方的数据的实体类  
  4.       private ThirdUserInfo info= null;  
  5.       @Override  
  6.       protected void onCreate(Bundle savedInstanceState) {  
  7.              super.onCreate(savedInstanceState);  
  8.             AppManager. getAppManager().addActivity(WXEntryActivity. this);  
  9.             BaseApplication. mIwapi.handleIntent(getIntent(), WXEntryActivity.this);  //必须调用此句话  
  10.       }  
  11.   
  12.       @Override  
  13.       protected void onNewIntent(Intent intent) {  
  14.              super.onNewIntent(intent);  
  15.             BaseApplication. mIwapi.handleIntent(intent, WXEntryActivity.this);//必须调用此句话  
  16.       }  
  17.   
  18.       @Override  
  19.       public void onReq(BaseReq req) {  
  20.             System. out.println();  
  21.       }  
  22.         
  23.         
  24.   
  25.       /** 
  26.       * Title: onResp 
  27.       * 
  28.       *           API:https://open.weixin.qq.com/ cgi- bin/showdocument ?action=dir_list&t=resource/res_list&verify=1&id=open1419317853 &lang=zh_CN 
  29.       * Description:在此处得到Code之后调用https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code 
  30.       *  获取到token和openID。之后再调用https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID 获取用户个人信息 
  31.       *  
  32.       * @param arg0 
  33.       * @see com.tencent.mm.sdk.openapi.IWXAPIEventHandler#onResp(com.tencent.mm.sdk.openapi.BaseResp) 
  34.        */  
  35.       @Override  
  36.       public void onResp(BaseResp arg0) {  
  37.              bundle=getIntent().getExtras();  
  38.             SendAuth.Resp resp = new SendAuth.Resp( bundle);  
  39.           //获取到code之后,需要调用接口获取到access_token  
  40.              if (resp. errCode == BaseResp.ErrCode. ERR_OK) {     
  41.                   String code = resp. token;  
  42.                    if(BaseApplication. isWxLogin){  
  43.                         getToken(code);  
  44.                   } else{  
  45.                         WXEntryActivity. this.finish();  
  46.                   }  
  47.             } else{  
  48.                   WXEntryActivity. this.finish();  
  49.             }  
  50.   
  51.       }  
  52.           //这个方法会取得accesstoken  和openID  
  53.       private void getToken(String code){  
  54.             MyProgressDialog. showDialog(WXEntryActivity.this"登陆""正在获取用户信息" );  
  55.             HttpBase. get("https://api.weixin.qq.com/sns/oauth2/access_token?appid=wxd7673d08f6c1963d&secret=223d726f966031f30125d0e4e7d4aed3&code=" +code+"&grant_type=authorization_code" , new JsonHttpResponseHandler(){  
  56.                    @Override  
  57.                    public void onSuccess( int statusCode, JSONObject response) {  
  58.                          super.onSuccess(statusCode, response);  
  59.                          info = new ThirdUserInfo();  
  60.                          info.setThirdID(response.optString( "openid"));  
  61.                         getUserInfo(response.optString( "access_token"),response.optString( "openid"));  
  62.                   }  
  63.                    @Override  
  64.                    public void onFailure( int statusCode, Throwable e,  
  65.                               JSONObject errorResponse) {  
  66.                          // TODO Auto-generated method stub  
  67.                          super.onFailure(statusCode, e, errorResponse);  
  68.                         MyProgressDialog. closeDialog();  
  69.                         HttpBase. onFailureTips(WXEntryActivity.this, errorResponse);  
  70.                   }  
  71.             });  
  72.       }  
  73.         
  74.           //获取到token和openID之后,调用此接口得到身份信息  
  75.       private void getUserInfo(String token,String openID){  
  76.             HttpBase. get("https://api.weixin.qq.com/sns/userinfo?access_token=" +token+"&openid=" +openID, new JsonHttpResponseHandler(){  
  77.                    @Override  
  78.                    public void onSuccess( int statusCode, JSONObject response) {  
  79.                          super.onSuccess(statusCode, response);  
  80.                          info.setNickName(response.optString( "nickname"));  
  81.                          info.setGender(response.optInt( "sex")==1"男""女");  
  82.                          info.setIcon(response.optString( "headimgurl"));  
  83.                         ThirdUserVerify. verifyUser(WXEntryActivity.this, info, 3);  
  84. //                      AppManager.getAppManager().finishActivity(LoginActivity.class);  
  85.                   }  
  86.                    @Override  
  87.                    public void onFailure( int statusCode, Throwable e,  
  88.                               JSONObject errorResponse) {  
  89.                          super.onFailure(statusCode, e, errorResponse);  
  90.                         MyProgressDialog. closeDialog();  
  91.                         HttpBase. onFailureTips(WXEntryActivity.this, errorResponse);  
  92.                   }  
  93.             });  
  94.       }  
  95. }  


QQ登录

1、注册APPKEY2、配置xml文件:[html] view plain copy
  1.    <!-- QQ -->  
  2. <activity  
  3.     android:name"com.tencent.tauth.AuthActivity"  
  4.     android:launchMode"singleTask"  
  5.     android:noHistory"true" >  
  6.     <intent-filter >  
  7.         <action android:name ="android.intent.action.VIEW" />  
  8.   
  9.         <category android:name ="android.intent.category.DEFAULT" />  
  10.         <category android:name"android.intent.category.BROWSABLE" />  
  11.   
  12.         <data android:scheme ="1104406273" />  
  13.     </intent-filter >  
  14. </activity >  
  15. <activity  
  16.     android:name"com.tencent.connect.common.AssistActivity"  
  17.     android:configChanges="orientation|keyboardHidden|screenSize"  
  18.     android:theme"@android:style/Theme.Translucent.NoTitleBar" />  
[html] view plain copy
  1.   
[html] view plain copy
  1. <span style="white-space:pre">    </span>  
[html] view plain copy
  1.   

[java] view plain copy
  1. //初始化Tencent   
  2. public Tencent mTencent = Tencent.createInstance(APPConstants. QQ_APPID,LoginActivity.this);   
  3.     // QQ发起登陆  
  4.       mTencent.login(LoginActivity. this"all"new IUiListener() {   
  5.   
  6.                                @Override  
  7.                                public void onCancel() {  
  8.                                       
  9.                               }  
  10.   
  11.                                @Override  
  12.                                public void onComplete(Object arg0) {     
  13.                     //登陆成功的回调,在此处可以获取用户信息  
  14.                                     MyProgressDialog. showDialogWithFalse(LoginActivity.this"登陆""正在获取用户信息" );  
  15.                                     initOpenidAndToken((JSONObject) arg0);  
  16.                                     updateUserInfo();  
  17.                               }  
  18.   
  19.                                @Override  
  20.                                public void onError(UiError arg0) {  
  21.                                       
  22.                               }  
  23.   
  24.                         });  
  25.   
  26. /** 
  27.        * @Title: initOpenidAndToken 
  28.        * @Description: 初始化OPENID以及TOKEN身份验证。 
  29.        * @param @param jsonObject 
  30.        * @return void 
  31.        * @throws 
  32.        */  
  33.       private void initOpenidAndToken (JSONObject jsonObject) {  
  34.              thirdUser = new ThirdUserInfo();  
  35.              try {  
  36.                   //这里的Constants类,是 com.tencent.connect.common.Constants类,下面的几个参数也是固定的  
  37.                   String token = jsonObject.getString(Constants.PARAM_ACCESS_TOKEN );  
  38.                   String expires = jsonObject.getString(Constants.PARAM_EXPIRES_IN );  
  39.         //OPENID,作为唯一身份标识  
  40.                   String openId = jsonObject.getString(Constants.PARAM_OPEN_ID );    
  41.                    if (!TextUtils. isEmpty(token) && !TextUtils.isEmpty(expires)&& !TextUtils. isEmpty(openId)) {  
  42.                     //设置身份的token  
  43.                          mTencent.setAccessToken(token, expires);    
  44.                          mTencent.setOpenId(openId);  
  45.                          thirdUser.setThirdID(openId);  
  46.                   }  
  47.                   } catch (Exception e) {  
  48.             }  
  49.       }  
  50.   
  51.       /** 
  52.        * @Title: updateUserInfo 
  53.        * @Description: 在回调里面可以获取用户信息数据了 
  54.        * @param 
  55.        * @return void 
  56.        * @throws 
  57.        */  
  58.       private void updateUserInfo() {  
  59.              if ( mTencent != null && mTencent.isSessionValid()) {  
  60.                    UserInfo mInfo = new UserInfo(LoginActivity. this,  mTencent.getQQToken());  
  61.                   mInfo.getUserInfo(listener);  
  62.                   IUiListener listener = new IUiListener() {  
  63.   
  64.                          @Override  
  65.                          public void onError(UiError e) {  
  66.                               MyProgressDialog. closeDialog();  
  67.                         }  
  68.   
  69.                          // 用户的信息回调在此处  
  70.                          @Override  
  71.                          public void onComplete( final Object response) {  
  72.                                // 返回Bitmap对象。  
  73.                                try {  
  74.                                     JSONObject obj = new JSONObject(response.toString());  
  75.                                      thirdUser.setNickName(obj.optString( "nickname"));  
  76.                                      thirdUser.setIcon(obj.optString( "figureurl_qq_2"));  
  77.                                      thirdUser.setGender(obj.optString( "gender"));  
  78.                                     ThirdUserVerify. verifyUser(LoginActivity.this,thirdUser, 1);  
  79.                               } catch (JSONException e) {  
  80.                                     e.printStackTrace();  
  81.                               }  
  82.                         }  
  83.   
  84.                          @Override  
  85.                          public void onCancel() {  
  86.                               MyProgressDialog. closeDialog();  
  87.                         }  
  88.                   };  
  89.            
  90.             }  
  91.       }