qq平台登录

简介: <p style="color:rgb(54,46,43); font-family:Arial; font-size:14px; line-height:26px"> 在APP开发过程中,时常会用到第三方账号登录体系。</p> <p style="color:rgb(54,46,43); font-family:Arial; font-size:14px; line-height:2

在APP开发过程中,时常会用到第三方账号登录体系。

下面,简要说明QQ的第三方登录体系在Android平台上的运用。

申请APPID

进入QQ互联的官网,http://connect.qq.com/

在管理中心中创建移动应用。



创建完成后,可以得到APPID。



并在下方的协作者测试号中,填写控应用测试用的QQ号码。


导入Jar包

将下载得到的Jar包导入工程,并在AndroidManifest.xml文件中进行注册。
[html]  view plain copy
  1.       <activity  
  2.        android:name="com.tencent.tauth.AuthActivity"  
  3.        android:noHistory="true"  
  4.        android:launchMode="singleTask" >  
  5.     <intent-filter>  
  6.             <action android:name="android.intent.action.VIEW" />  
  7.             <category android:name="android.intent.category.DEFAULT" />  
  8.             <category android:name="android.intent.category.BROWSABLE" />  
  9.             <data android:scheme="tencent100546930" />  
  10.      </intent-filter>  
  11. </activity>  

其中,<data android:scheme="tencent100546930" />中的数字需要替换成自己申请得到的APPID。

创建登录接口

所有的SDK接口调用,都会传入一个回调,用以接收SDK返回的调用结果。回调的主要接口有两种:

(1) IUiListener:调用SDK已经封装好的接口时,例如:登录、快速支付登录、应用分享、应用邀请等接口。

(2) IRequestListener:使用requestAsync、request等通用方法调用sdk未封装的接口时,例如上传图片、查看相册等。

在这里创建IUiListener接口实现相应的登录授权操作:
[java]  view plain copy
  1.  private void onClickLogin() {  
  2.      if (!mTencent.isSessionValid()) {  
  3.          IUiListener listener = new IUiListener() {  
  4.             /** 授权失败的回调*/  
  5.     @Override  
  6.     public void onError(UiError arg0) {  
  7.         // TODO Auto-generated method stub  
  8.         Toast.makeText(LoginActivity.this"授权失败"1000).show();  
  9.         Message msg = new Message();  
  10.         msg.arg1 = 2;  
  11.         handler.sendMessage(msg);     
  12.     }  
  13.     /** 授权成功的回调*/  
  14.     @Override  
  15.     public void onComplete(JSONObject arg0) {  
  16.         // TODO Auto-generated method stub  
  17.         Toast.makeText(LoginActivity.this"授权成功"1000).show();  
  18.         Message msg = new Message();  
  19.         msg.what = 2;  
  20.         msg.arg1 = 1;  
  21.         msg.obj = arg0;  
  22.         handler.sendMessage(msg);  
  23.     }  
  24.     /** 取消授权的回调*/  
  25.     @Override  
  26.     public void onCancel() {  
  27.         // TODO Auto-generated method stub  
  28.         Toast.makeText(LoginActivity.this"取消授权"1000).show();  
  29.         Message msg = new Message();  
  30.         msg.arg1 = 3;  
  31.         handler.sendMessage(msg);     
  32.     }  
  33. };  
  34.          mTencent.login(this, SCOPE, listener);  
  35.      } else {  
  36.          mTencent.logout(this);  
  37.      }  
  38.  }  

其中,mTencent为QQSDK主要实现类Tencent类的实例。
[java]  view plain copy
  1. // Tencent类是SDK的主要实现类,开发者可通过Tencent类访问腾讯开放的OpenAPI。  
  2. // 其中APP_ID是分配给第三方应用的appid,类型为String。  
  3. mTencent = Tencent.createInstance(APP_ID, this.getApplicationContext());  

将handler进行实例化
[java]  view plain copy
  1. handler = new Handler(this);  

并将类实现Callback接口,即可对上述类进行Handler的处理操作。
[java]  view plain copy
  1. @Override  
  2. public boolean handleMessage(Message msg) {  
  3.     // TODO Auto-generated method stub  
  4.     switch (msg.arg1) {  
  5.         case 1: { // 成功  
  6.             JSONObject object = (JSONObject) msg.obj;  
  7.             try {  
  8.                 openid = object.getString("openid").toString();  
  9.                 sBuilder.append("openid为:"+openid+"\n");  
  10.                 access_token = object.getString("access_token").toString();  
  11.                 url = url + "?access_token="+access_token+"&oauth_consumer_key="+APP_ID+  
  12.                         "&openid="+openid+"&format=json";  
  13.                 new MyUrlThread(url.toString(), 2,sHandler).start();  
  14.             } catch (JSONException e) {  
  15.                 // TODO Auto-generated catch block  
  16.                 e.printStackTrace();  
  17.             }  
  18.         }  
  19.         break;  
  20.         case 2: { // 失败  
  21.             Toast.makeText(this"", Toast.LENGTH_SHORT).show();  
  22.             return false;  
  23.         }  
  24.         case 3: { // 取消  
  25.             Toast.makeText(this"", Toast.LENGTH_SHORT).show();  
  26.             return false;  
  27.         }  
  28.     }  
  29.     return false;  
  30. }  

如果授权成功,即可得到返回的Openid。
从而,可以根据Openid调用腾讯所提供的官方接口,实现需要的操作。

接收回调

[java]  view plain copy
  1. //应用调用Andriod_SDK接口时,使能成功接收到回调  
  2. @Override  
  3. protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  4.     // TODO Auto-generated method stub  
  5.       

应用实例代码

[java]  view plain copy
  1. package com.test.wotao;  
  2.   
  3.   
  4. import java.io.IOException;  
  5. import java.net.MalformedURLException;  
  6. import java.net.URL;  
  7.   
  8. import org.json.JSONException;  
  9. import org.json.JSONObject;  
  10.   
  11.   
  12. import com.tencent.plus.TouchView;  
  13. import com.tencent.tauth.IUiListener;  
  14. import com.tencent.tauth.Tencent;  
  15. import com.tencent.tauth.UiError;  
  16. import com.test.util.MyApplication;  
  17. import com.test.util.MyThread;  
  18. import com.test.util.MyUrlThread;  
  19.   
  20. import android.annotation.SuppressLint;  
  21. import android.app.Activity;  
  22. import android.content.Intent;  
  23. import android.graphics.drawable.Drawable;  
  24. import android.os.Bundle;  
  25. import android.os.Handler;  
  26. import android.os.Handler.Callback;  
  27. import android.os.Message;  
  28. import android.os.StrictMode;  
  29. import android.view.View;  
  30. import android.view.View.OnClickListener;  
  31. import android.view.inputmethod.BaseInputConnection;  
  32. import android.widget.Button;  
  33. import android.widget.CheckedTextView;  
  34. import android.widget.ImageView;  
  35. import android.widget.TextView;  
  36. import android.widget.Toast;  
  37. /** 
  38.  * 创建时间:2013-10-30 
  39. APP ID:100546930 
  40. APP KEY:6ff068cfbae8fa0b53f9a3c27f1af321 
  41.  * @author 402-9 
  42.  * 
  43.  */  
  44.   
  45. public class LoginActivity extends Activity implements OnClickListener,Callback{  
  46.     private Button login_qq;  
  47.     private TextView nickname;  
  48.     private ImageView image;  
  49.     private Tencent mTencent;  
  50.     private String imageurl;  
  51.     String url_qqlogin;  
  52.     private String openid;  
  53.     private String access_token;  
  54.     private String SCOPE = "get_simple_userinfo,add_topic";  
  55.     private static final String APP_ID = "100546930";  
  56.     private String url = "https://graph.qq.com/user/get_user_info";  
  57.     private Handler handler;  
  58.     private StringBuilder sBuilder = new StringBuilder();  
  59.     private Handler sHandler = new Handler(){  
  60.         public void handleMessage(Message msg) {  
  61.             if (msg.what == 2) {  
  62.                 String result = msg.obj.toString();  
  63.                 JSONObject data;  
  64.                 try {  
  65.                     data = new JSONObject(result);  
  66.                     String ret = data.getString("ret");  
  67.                     String messsage = data.getString("msg");  
  68.                     if (Integer.valueOf(ret) == 0) {  
  69.                         String name = data.getString("nickname");  
  70.                         sBuilder.append("nickname为:"+name+"\n");  
  71.                         String gender = data.getString("gender");  
  72.                         sBuilder.append("gender为:"+gender+"\n");  
  73.                         imageurl = data.getString("figureurl_1");  
  74.                         sBuilder.append("imageurl为:"+imageurl+"\n");  
  75. //                      image.setImageDrawable(Drawable.createFromStream(new URL(imageurl).openConnection()  
  76. //                      .getInputStream(), "src"));  
  77.                         url_qqlogin = "jiekou.php?code=qq_user&nickname="+name+"&email="+name+  
  78.                                 "@qq.com&figureurl="+imageurl+"&sex="+gender+  
  79.                                 "&openid="+openid+"&accesstoken="+access_token;  
  80.                         System.out.println("url_qqlogin----"+url_qqlogin);  
  81.                         new MyThread(url_qqlogin.toString(), 1,qqHandler).start();  
  82.                     }  
  83.   
  84.                 } catch (Exception e) {  
  85.                     // TODO Auto-generated catch block  
  86.                     e.printStackTrace();  
  87.                 }  
  88.   
  89.                 System.out.println("sBuilder---"+sBuilder);  
  90.                 nickname.setText(sBuilder);  
  91.                   
  92.             }  
  93.         };  
  94.     };  
  95.     private Handler qqHandler = new Handler(){  
  96.         public void handleMessage(Message msg) {  
  97.             if (msg.what==1) {  
  98.                 String result = msg.obj.toString();  
  99.                 JSONObject data;  
  100.                 try {  
  101.                     data = new JSONObject(result);  
  102.                     String nickname = data.getString("nickname");  
  103.                     String message = data.getString("msg");  
  104.                     sBuilder.append("QQ的nickname为:"+nickname+"\n");  
  105.                     sBuilder.append("QQ的message为:"+message+"\n");  
  106.                     System.out.println("333==="+sBuilder);  
  107.                     Toast.makeText(LoginActivity.this, message, 1000).show();  
  108.                 } catch (Exception e) {  
  109.                     // TODO Auto-generated catch block  
  110.                     e.printStackTrace();  
  111.                 }  
  112.                 nickname.setText(sBuilder);  
  113.             }  
  114.         };  
  115.     };  
  116.     @Override  
  117.     protected void onCreate(Bundle savedInstanceState) {  
  118.         // TODO Auto-generated method stub  
  119.         super.onCreate(savedInstanceState);  
  120.         setContentView(R.layout.login_qq);  
  121.         handler = new Handler(this);  
  122.         // Tencent类是SDK的主要实现类,开发者可通过Tencent类访问腾讯开放的OpenAPI。  
  123.         // 其中APP_ID是分配给第三方应用的appid,类型为String。  
  124.         mTencent = Tencent.createInstance(APP_ID, this.getApplicationContext());  
  125.         login_qq = (Button) findViewById(R.id.login_qq);  
  126.         login_qq.setOnClickListener(this);  
  127.         nickname = (TextView) findViewById(R.id.nickname);  
  128.         image = (ImageView) findViewById(R.id.image);  
  129.           
  130.     }  
  131.     @Override  
  132.     public void onClick(View v) {  
  133.         // TODO Auto-generated method stub  
  134.         switch (v.getId()) {  
  135.             case R.id.login_qq:  
  136.                 onClickLogin();  
  137.                 break;  
  138.         }  
  139.     }  
  140.     //应用调用Andriod_SDK接口时,使能成功接收到回调  
  141.     @Override  
  142.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  143.         // TODO Auto-generated method stub  
  144.          mTencent.onActivityResult(requestCode, resultCode, data);  
  145.     }  
  146.     private void onClickLogin() {  
  147.         if (!mTencent.isSessionValid()) {  
  148.             IUiListener listener = new IUiListener() {  
  149.                 /** 授权失败的回调*/  
  150.                 @Override  
  151.                 public void onError(UiError arg0) {  
  152.                     // TODO Auto-generated method stub  
  153.                     Toast.makeText(LoginActivity.this"授权失败"1000).show();  
  154.                     Message msg = new Message();  
  155.                     msg.arg1 = 2;  
  156.                     handler.sendMessage(msg);     
  157.                 }  
  158.                 /** 授权成功的回调*/  
  159.                 @Override  
  160.                 public void onComplete(JSONObject arg0) {  
  161.                     // TODO Auto-generated method stub  
  162.                     Toast.makeText(LoginActivity.this"授权成功"1000).show();  
  163.                     Message msg = new Message();  
  164.                     msg.what = 2;  
  165.                     msg.arg1 = 1;  
  166.                     msg.obj = arg0;  
  167.                     handler.sendMessage(msg);  
  168.                 }  
  169.                 /** 取消授权的回调*/  
  170.                 @Override  
  171.                 public void onCancel() {  
  172.                     // TODO Auto-generated method stub  
  173.                     Toast.makeText(LoginActivity.this"取消授权"1000).show();  
  174.                     Message msg = new Message();  
  175.                     msg.arg1 = 3;  
  176.                     handler.sendMessage(msg);     
  177.                 }  
  178.             };  
  179.             mTencent.login(this, SCOPE, listener);  
  180.         } else {  
  181.             mTencent.logout(this);  
  182.         }  
  183.     }  
  184.       
  185.     @Override  
  186.     public boolean handleMessage(Message msg) {  
  187.         // TODO Auto-generated method stub  
  188.         switch (msg.arg1) {  
  189.             case 1: { // 成功  
  190.                 JSONObject object = (JSONObject) msg.obj;  
  191.                 try {  
  192.                     openid = object.getString("openid").toString();  
  193.                     sBuilder.append("openid为:"+openid+"\n");  
  194.                     access_token = object.getString("access_token").toString();  
  195.                     url = url + "?access_token="+access_token+"&oauth_consumer_key="+APP_ID+  
  196.                             "&openid="+openid+"&format=json";  
  197.                     new MyUrlThread(url.toString(), 2,sHandler).start();  
  198.                 } catch (JSONException e) {  
  199.                     // TODO Auto-generated catch block  
  200.                     e.printStackTrace();  
  201.                 }  
  202.             }  
  203.             break;  
  204.             case 2: { // 失败  
  205.                 Toast.makeText(this"", Toast.LENGTH_SHORT).show();  
  206.                 return false;  
  207.             }  
  208.             case 3: { // 取消  
  209.                 Toast.makeText(this"", Toast.LENGTH_SHORT).show();  
  210.                 return false;  
  211.             }  
  212.         }  
  213.         return false;  
  214.     }  
  215. }  
目录
相关文章
|
6月前
|
前端开发 NoSQL 数据库
设计 QQ、微信等第三方账号登陆
设计 QQ、微信等第三方账号登陆
61 0
设计 QQ、微信等第三方账号登陆
|
6月前
|
前端开发 NoSQL 数据库
如何设计 QQ、微信、微博、Github 等等,第三方账号登陆 ?(附表设计)
如何设计 QQ、微信、微博、Github 等等,第三方账号登陆 ?(附表设计)
61 1
|
Java Maven
集成一个以官网(微信,QQ,微博)为标准的登录分享功能
今天要分享的是一个老生常谈的一个功能,也是网上一搜一大片的技术点,没什么技术含量,就是整合一下,提供一下方便,相对于友盟,ShareSdk中夹杂着一些别的功能,此文封装的绝对纯净,除了官网所提供的,不夹杂任何的代码逻辑,登录就是登录,分享就是分享,实实在在的以官网为标准。
122 0
|
JavaScript 网络架构
qq第三方登录
qq第三方登录
189 0
|
API 数据安全/隐私保护
QQ登陆功能的实现2
QQ登陆功能的实现2     由于看到园子里有朋友说需要讲解和剖析实现的步骤,前面的QQ登陆实现只有代码,所以这篇补上    1.  分析 1). 当运行QQ.exe后会出现qq登陆界面的窗体 2).
1051 0
网站集成QQ登录功能
最近在做一个项目时,客户要求网站能够集成QQ登录的功能,以前没做过这方面的开发,于是去QQ的开放平台官网研究了一下相关资料,经过自己的艰苦探索,终于实现了集成QQ登录的功能,现在把相关的开发经验总结一下,希望对有这方面需求的朋友有所帮助。
1090 0