关闭

Android之QQ授权登录获取用户信息

标签: 腾讯微博版权qq
104人阅读 评论(0) 收藏 举报
分类:

有时候我们开发的app需要方便用户简单登录,可以让用户使用自己的qq、微信、微博登录到我们自己开发的app。

今天就在这里总结一下如何在自己的app中集成QQ授权登录获取用户信息的功能。


首先我们打开腾讯开发平台这个网页,点击---->移动应用---->创建应用,成功创建应用后,可以产生我们需要的App ID和App Key,如下图所示:



然后我们需要下载Android-SDK-vxxx,下载完后解压我们可以得到两个jar包,和一个例子代码,这两个jar包是我们需要导入到自己app中的,它们的名字是:mta-sdk-1.6.2.jar、open_sdk_r5043.jar。

很重要的参考资料是网站上提供的API文档和解压之后的Sample例子代码。


先来看一下demo效果:

      


接着我们开始集成,在AndroidManifest文件中加入以下内容:

  1. <uses-permission android:name="android.permission.INTERNET" />  
  2. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  
  3.   
  4. <application  
  5.     android:allowBackup="true"  
  6.     android:icon="@drawable/ic_launcher"  
  7.     android:label="@string/app_name"  
  8.     android:theme="@style/AppTheme" >  
  9.     <activity  
  10.         android:name="com.bear.qqlogin.MainActivity"  
  11.         android:label="@string/app_name" >  
  12.         <intent-filter>  
  13.             <action android:name="android.intent.action.MAIN" />  
  14.   
  15.             <category android:name="android.intent.category.LAUNCHER" />  
  16.         </intent-filter>  
  17.     </activity>  
  18.     <activity  
  19.         android:name="com.tencent.tauth.AuthActivity"  
  20.         android:launchMode="singleTask"  
  21.         android:noHistory="true" >  
  22.         <intent-filter>  
  23.             <action android:name="android.intent.action.VIEW" />  
  24.   
  25.             <category android:name="android.intent.category.DEFAULT" />  
  26.             <category android:name="android.intent.category.BROWSABLE" />  
  27.   
  28.             <data android:scheme="1104732758" />  
  29.         </intent-filter>  
  30.     </activity>  
  31.     <activity  
  32.         android:name="com.tencent.connect.common.AssistActivity"  
  33.         android:configChanges="orientation|keyboardHidden|screenSize"  
  34.         android:theme="@android:style/Theme.Translucent.NoTitleBar" />  
  35. </application>  

在主程序里面实现登录和获取用户信息,主要起作用的语句:

mTencent.login(MainActivity.this, scope, loginListener); //登录


userInfo = new UserInfo(MainActivity.this, mTencent.getQQToken()); //获取用户信息
userInfo.getUserInfo(userInfoListener);


整体代码如下:

  1. import org.json.JSONObject;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. import android.view.Menu;  
  7. import android.view.View;  
  8. import android.view.View.OnClickListener;  
  9. import android.widget.EditText;  
  10. import android.widget.Toast;  
  11.   
  12. import com.tencent.connect.UserInfo;  
  13. import com.tencent.connect.common.Constants;  
  14. import com.tencent.tauth.IUiListener;  
  15. import com.tencent.tauth.Tencent;  
  16. import com.tencent.tauth.UiError;  
  17.   
  18. /** 
  19.  *  
  20.  * 通过调用Tencent类的login函数发起登录/校验登录态。  
  21.  *  
  22.  * 该API具有两个作用: 
  23.  * (1)如果开发者没有调用mTencent实例的setOpenId、setAccessToken API, 
  24.  *      则该API执行正常的登录操作; 
  25.  * (2)如果开发者先调用mTencent实例的setOpenId、setAccessToken 
  26.  *      API,则该API执行校验登录态的操作。如果登录态有效,则返回成功给应用, 
  27.  *      如果登录态失效,则会自动进入登录流程,将最新的登录态数据返回给应用 
  28.  *  
  29.  * @author super bear 
  30.  *  
  31.  */  
  32. public class MainActivity extends Activity {  
  33.   
  34.     private static final String APPID = "1104732758";  
  35.   
  36.     private EditText et1;  
  37.     private EditText et2;  
  38.       
  39.     private Tencent mTencent; //qq主操作对象  
  40.     private IUiListener loginListener; //授权登录监听器  
  41.     private IUiListener userInfoListener; //获取用户信息监听器  
  42.     private String scope; //获取信息的范围参数  
  43.     private UserInfo userInfo; //qq用户信息  
  44.   
  45.     @Override  
  46.     protected void onCreate(Bundle savedInstanceState) {  
  47.         super.onCreate(savedInstanceState);  
  48.         setContentView(R.layout.activity_main);  
  49.         setupViews();  
  50.         initData();  
  51.     }  
  52.   
  53.     @Override  
  54.     protected void onDestroy() {  
  55.         if (mTencent != null) {  
  56.             //注销登录  
  57.             mTencent.logout(MainActivity.this);  
  58.         }  
  59.         super.onDestroy();  
  60.     }  
  61.   
  62.     private void setupViews() {  
  63.         et1 = (EditText) findViewById(R.id.editText1);  
  64.         et2 = (EditText) findViewById(R.id.editText2);  
  65.   
  66.         findViewById(R.id.button2).setOnClickListener(new OnClickListener() {  
  67.   
  68.             @Override  
  69.             public void onClick(View v) {  
  70.                 System.out.println("你点击了使用qq登录按钮");  
  71.                 login();  
  72.             }  
  73.         });  
  74.           
  75.         findViewById(R.id.button3).setOnClickListener(new OnClickListener() {  
  76.               
  77.             @Override  
  78.             public void onClick(View v) {  
  79.                 // TODO Auto-generated method stub  
  80.                 System.out.println("开始获取用户信息");  
  81.                 userInfo = new UserInfo(MainActivity.this, mTencent.getQQToken());  
  82.                 userInfo.getUserInfo(userInfoListener);  
  83.             }  
  84.         });  
  85.     }  
  86.   
  87.     private void initData() {  
  88.         //初始化qq主操作对象  
  89.         mTencent = Tencent.createInstance(APPID, MainActivity.this);  
  90.         //要所有权限,不然会再次申请增量权限,这里不要设置成get_user_info,add_t  
  91.         scope = "all";  
  92.           
  93.         loginListener = new IUiListener() {  
  94.   
  95.             @Override  
  96.             public void onError(UiError arg0) {  
  97.                 // TODO Auto-generated method stub  
  98.   
  99.             }  
  100.   
  101.             /** 
  102.              * 返回json数据样例 
  103.              *  
  104.              * {"ret":0,"pay_token":"D3D678728DC580FBCDE15722B72E7365", 
  105.              * "pf":"desktop_m_qq-10000144-android-2002-", 
  106.              * "query_authority_cost":448, 
  107.              * "authority_cost":-136792089, 
  108.              * "openid":"015A22DED93BD15E0E6B0DDB3E59DE2D", 
  109.              * "expires_in":7776000, 
  110.              * "pfkey":"6068ea1c4a716d4141bca0ddb3df1bb9", 
  111.              * "msg":"", 
  112.              * "access_token":"A2455F491478233529D0106D2CE6EB45", 
  113.              * "login_cost":499} 
  114.              */  
  115.             @Override  
  116.             public void onComplete(Object value) {  
  117.                 // TODO Auto-generated method stub  
  118.                   
  119.                 System.out.println("有数据返回..");  
  120.                 if (value == null) {  
  121.                     return;  
  122.                 }  
  123.   
  124.                 try {  
  125.                     JSONObject jo = (JSONObject) value;  
  126.   
  127.                     int ret = jo.getInt("ret");  
  128.                       
  129.                     System.out.println("json=" + String.valueOf(jo));  
  130.                       
  131.                     if (ret == 0) {  
  132.                         Toast.makeText(MainActivity.this"登录成功",  
  133.                                 Toast.LENGTH_LONG).show();  
  134.   
  135.                         String openID = jo.getString("openid");  
  136.                         String accessToken = jo.getString("access_token");  
  137.                         String expires = jo.getString("expires_in");  
  138.                         mTencent.setOpenId(openID);  
  139.                         mTencent.setAccessToken(accessToken, expires);  
  140.                     }  
  141.   
  142.                 } catch (Exception e) {  
  143.                     // TODO: handle exception  
  144.                 }  
  145.   
  146.             }  
  147.   
  148.             @Override  
  149.             public void onCancel() {  
  150.                 // TODO Auto-generated method stub  
  151.   
  152.             }  
  153.         };  
  154.           
  155.         userInfoListener = new IUiListener() {  
  156.               
  157.             @Override  
  158.             public void onError(UiError arg0) {  
  159.                 // TODO Auto-generated method stub  
  160.                   
  161.             }  
  162.               
  163.             /** 
  164.              * 返回用户信息样例 
  165.              *  
  166.              * {"is_yellow_year_vip":"0","ret":0, 
  167.              * "figureurl_qq_1":"http:\/\/q.qlogo.cn\/qqapp\/1104732758\/015A22DED93BD15E0E6B0DDB3E59DE2D\/40", 
  168.              * "figureurl_qq_2":"http:\/\/q.qlogo.cn\/qqapp\/1104732758\/015A22DED93BD15E0E6B0DDB3E59DE2D\/100", 
  169.              * "nickname":"攀爬←蜗牛","yellow_vip_level":"0","is_lost":0,"msg":"", 
  170.              * "city":"黄冈"," 
  171.              * figureurl_1":"http:\/\/qzapp.qlogo.cn\/qzapp\/1104732758\/015A22DED93BD15E0E6B0DDB3E59DE2D\/50", 
  172.              * "vip":"0","level":"0", 
  173.              * "figureurl_2":"http:\/\/qzapp.qlogo.cn\/qzapp\/1104732758\/015A22DED93BD15E0E6B0DDB3E59DE2D\/100", 
  174.              * "province":"湖北", 
  175.              * "is_yellow_vip":"0","gender":"男", 
  176.              * "figureurl":"http:\/\/qzapp.qlogo.cn\/qzapp\/1104732758\/015A22DED93BD15E0E6B0DDB3E59DE2D\/30"} 
  177.              */  
  178.             @Override  
  179.             public void onComplete(Object arg0) {  
  180.                 // TODO Auto-generated method stub  
  181.                 if(arg0 == null){  
  182.                     return;  
  183.                 }  
  184.                 try {  
  185.                     JSONObject jo = (JSONObject) arg0;  
  186.                     int ret = jo.getInt("ret");  
  187.                     System.out.println("json=" + String.valueOf(jo));  
  188.                     String nickName = jo.getString("nickname");  
  189.                     String gender = jo.getString("gender");  
  190.   
  191.                     Toast.makeText(MainActivity.this"你好," + nickName,  
  192.                             Toast.LENGTH_LONG).show();  
  193.   
  194.                 } catch (Exception e) {  
  195.                     // TODO: handle exception  
  196.                 }  
  197.                   
  198.                   
  199.             }  
  200.               
  201.             @Override  
  202.             public void onCancel() {  
  203.                 // TODO Auto-generated method stub  
  204.                   
  205.             }  
  206.         };  
  207.     }  
  208.   
  209.     private void login() {  
  210.         //如果session无效,就开始登录  
  211.         if (!mTencent.isSessionValid()) {  
  212.             //开始qq授权登录  
  213.             mTencent.login(MainActivity.this, scope, loginListener);  
  214.         }  
  215.     }  
  216.   
  217.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  218.         if (requestCode == Constants.REQUEST_API) {  
  219.             if (resultCode == Constants.RESULT_LOGIN) {  
  220.                 Tencent.handleResultData(data, loginListener);  
  221.             }  
  222.             super.onActivityResult(requestCode, resultCode, data);  
  223.         }  
  224.     }  
  225.   
  226.     @Override  
  227.     public boolean onCreateOptionsMenu(Menu menu) {  
  228.         // Inflate the menu; this adds items to the action bar if it is present.  
  229.         getMenuInflater().inflate(R.menu.main, menu);  
  230.         return true;  
  231.     }  
  232.   
  233. }  


整个Android项目下载链接:

QQLoginDemo(QQ授权登录代码)



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:339002次
    • 积分:5991
    • 等级:
    • 排名:第4204名
    • 原创:175篇
    • 转载:590篇
    • 译文:4篇
    • 评论:99条