Android QQ第三方登录详解

Android 接入QQ登录 共分为6步

本文只是对于QQ登录接入一个过程的详细描述,每一步为什么这样做没有做详细解释,但如果按照我说的每一步做下去,就能接入成功的,当成功后,回头看看代码就能完全明白(其实也很简单)。

好了接下来看步骤吧!一定会成功的

第一步获取 AppID

打开 http://open.qq.com/

点击应用接入

 

第一次需要按照说明 注册类型 ,如果是小白练手,推荐选择个人

通过步骤完成注册

在管理中心创建应用

选择创建的类型

之后将应用的基本信息填写完,其他信息可以以后发布再填,基本信息填写完后点击下方的    保存    按钮

之后  APPID就能正常使用。


第二步  下载 SDK    http://wiki.open.qq.com/wiki/mobile/SDK%E4%B8%8B%E8%BD%BD

(本文使用的是Android_SDK_V3.2.0(基础包)

第三步    接入SDK  下面我会详细讲解    参考是官网的http://wiki.open.qq.com/wiki/%E5%88%9B%E5%BB%BA%E5%B9%B6%E9%85%8D%E7%BD%AE%E5%B7%A5%E7%A8%8B

第四步  配置 AndroidManifest

1):权限声明:

[java]  view plain  copy
  1. <uses-permission android:name="android.permission.INTERNET" />  
  2. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  

2):加入Activity声明(这两个Activity是在jar包已经定义的好的,需要声明才能使用)

[java]  view plain  copy
  1. <activity  
  2.             android:name="com.tencent.tauth.AuthActivity"  
  3.             android:launchMode="singleTask"  
  4.             android:noHistory="true">  
  5.             <intent-filter>  
  6.                 <action android:name="android.intent.action.VIEW" />  
  7.   
  8.                 <category android:name="android.intent.category.DEFAULT" />  
  9.                 <category android:name="android.intent.category.BROWSABLE" />  
  10.   
  11.                 <data android:scheme="tencent自己的AppID前边的tencent不删  " />  
  12.               例如 :  <data android:scheme="tencent123123123" />  
  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" >    
  19.     </activity>  




第五步Java文件编写(下面代码全是在LoginActivity.Java)

1):监听事件添加:在xml文件中加入一个imageView用来唤起QQ登录 在Java文件中的代码如下

[java]  view plain  copy
  1. //QQ第三方登录  
  2.      Tencent   mTencent = Tencent.createInstance(“123123123”,getApplicationContext());//将123123123改为自己的AppID    
  3.       ImageView  QQlogin = (ImageView) findViewById(R.id.login_image_QQlogin);  
  4.         QQlogin.setOnClickListener(new View.OnClickListener() {  
  5.             @Override  
  6.             public void onClick(View v) {  
  7.                 //get_simple_userinfo  
  8.                 mTencent.login(LoginActivity.this,"all",new BaseUiListener());  
  9.             }  
  10.         });  

2): 回调:在唤起QQ登录后,需要一个回调的类(这个作用是检测是否登录成功),这个类在jar包里已经写好 只要调用即可(我把这个类作为一个内部使用)


[java]  view plain  copy
  1. private class BaseUiListener implements IUiListener {  
  2.   
  3.   
  4. //这个类需要实现三个方法 onComplete():登录成功需要做的操作写在这里  
  5. // onError onCancel 方法具体内容自己搜索  
  6.   
  7.         public void onComplete(Object response) {  
  8.             // TODO Auto-generated method stub  
  9.             Toast.makeText(getApplicationContext(), "登录成功", Toast.LENGTH_SHORT).show();  
  10.             try {  
  11.                 //获得的数据是JSON格式的,获得你想获得的内容  
  12.                 //如果你不知道你能获得什么,看一下下面的LOG  
  13.                 Log.v("----TAG--""-------------"+response.toString());  
  14.                 openidString = ((JSONObject) response).getString("openid");  
  15.                 mTencent.setOpenId(openidString);  
  16.                 saveUser("44","text","text",1);  
  17.                 mTencent.setAccessToken(((JSONObject) response).getString("access_token"),((JSONObject) response).getString("expires_in"));  
  18.   
  19.   
  20.                 Log.v("TAG""-------------"+openidString);  
  21.                 //access_token= ((JSONObject) response).getString("access_token");          
  22.       //expires_in = ((JSONObject) response).getString("expires_in");  
  23.             } catch (JSONException e) {  
  24.                 // TODO Auto-generated catch block  
  25.                 e.printStackTrace();  
  26.             }  
  27.             /**到此已经获得OpneID以及其他你想获得的内容了  
  28.              QQ登录成功了,我们还想获取一些QQ的基本信息,比如昵称,头像什么的,这个时候怎么办?  
  29.              sdk给我们提供了一个类UserInfo,这个类中封装了QQ用户的一些信息,我么可以通过这个类拿到这些信息  
  30.              如何得到这个UserInfo类呢?   
[java]  view plain  copy
  1. 获取详细信息的UserInfo ,返回的信息参看下面地址:  
  2. http://wiki.open.qq.com/wiki/%E8%8E%B7%E5%8F%96%E7%94%A8%E6%88%B7%E4%BF%A1%E6%81%AF#1._Tencent.E7.B1.BB.E7.9A.84request.E6.88.96requestAsync.E6.8E.A5.E5.8F.A3.E7.AE.80.E4.BB.8B  
  3.  */  
  4.   
  5.             QQToken qqToken = mTencent.getQQToken();  
  6.             UserInfo info = new UserInfo(getApplicationContext(), qqToken);  
  7.   
  8.         //    info.getUserInfo(new BaseUIListener(this,"get_simple_userinfo"));  
  9.             info.getUserInfo(new IUiListener() {  
  10.                 @Override  
  11.                 public void onComplete(Object o) {  
  12.                  //用户信息获取到了  
  13.                     try {  
  14.                               Log.v("用户名", ((JSONObject) o).getString("nickname"));  
  15.                               Log.v("用户姓名", ((JSONObject) o).getString("gender"));  
  16.                         Log.v("UserInfo",o.toString());  
  17.                         Intent intent1 = new Intent(LoginActivity.this,MainActivity.class);  
  18.                         startActivity(intent1);  
  19.                         finish();  
  20.                     } catch (JSONException e) {  
  21.                         // TODO Auto-generated catch block  
  22.                         e.printStackTrace();  
  23.                     }  
  24.                 }  
  25.   
  26.                 @Override  
  27.                 public void onError(UiError uiError) {  
  28.                     Log.v("UserInfo","onError");  
  29.                 }  
  30.   
  31.                 @Override  
  32.                 public void onCancel() {  
  33.                     Log.v("UserInfo","onCancel");  
  34.                 }  
  35.             });  
  36.   
  37.   
  38.   
  39.         }  
  40.   
  41.         @Override  
  42.         public void onError(UiError uiError) {  
  43.             Toast.makeText(getApplicationContext(), "onError", Toast.LENGTH_SHORT).show();  
  44.         }  
  45.   
  46.         @Override  
  47.         public void onCancel() {  
  48.             Toast.makeText(getApplicationContext(), "onCancel", Toast.LENGTH_SHORT).show();  
  49.         }  
  50.   
  51.   
  52.     }  

3):还有最重要的是在onActivityResult()方法中添加如下代码,不然调用完返回时会报错


[java]  view plain  copy
  1. @Override  
  2.    protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  3.        super.onActivityResult(requestCode, resultCode, data);  
  4.   
  5.        Tencent.onActivityResultData(requestCode, resultCode, data, new BaseUiListener());  
  6.   
  7.        if(requestCode == Constants.REQUEST_API) {  
  8.            if(resultCode == Constants.REQUEST_LOGIN) {  
  9.                Tencent.handleResultData(data, new BaseUiListener());  
  10.            }  
  11.        }  
  12.    }  


4):另外引入的包需要如下:

[java]  view plain  copy
  1. import com.tencent.connect.UserInfo;  
  2. import com.tencent.connect.auth.QQToken;  
  3. import com.tencent.connect.common.Constants;  
  4. import com.tencent.tauth.IUiListener;  
  5. import com.tencent.tauth.Tencent;  
  6. import com.tencent.tauth.UiError;  

第六步 对于布局文件 只要有一个控件能够触发 事件就可以(setOnClickListener)
本博文 使用的是一个imageView控件 在第五步的1):监听事件的添加中有体现

下面是完整的Java demo
[plain]  view plain  copy
  1. //这是QQ登录的详细代码直接复制粘贴时可能会使用不了,会有错误的地方  
  2. //但整体思路是这样的  
  3. import android.content.Intent;  
  4. import android.content.SharedPreferences;  
  5. import android.os.Bundle;  
  6. import android.support.v7.app.AppCompatActivity;  
  7. import android.util.Log;  
  8. import android.view.View;  
  9. import android.view.Window;  
  10. import android.widget.Button;  
  11. import android.widget.EditText;  
  12. import android.widget.ImageView;  
  13. import android.widget.Toast;  
  14.   
  15. import com.tencent.connect.UserInfo;  
  16. import com.tencent.connect.auth.QQToken;  
  17. import com.tencent.connect.common.Constants;  
  18. import com.tencent.tauth.IUiListener;  
  19. import com.tencent.tauth.Tencent;  
  20. import com.tencent.tauth.UiError;  
  21.   
  22. import org.json.JSONException;  
  23. import org.json.JSONObject;  
  24.   
  25. public class LoginActivity extends AppCompatActivity {  
  26.     public Button bt,zhuce;  
  27.     private EditText edit_user,edit_pass;  
  28.     private SharedPreferences sp;  
  29.     private SharedPreferences.Editor editor;  
  30.     private String username,userpass,userId;  
  31.     private Tencent mTencent;  
  32.     private Button QQ,map;  
  33.   
  34.     private String openidString;  
  35.     private ImageView QQlogin;  
  36.     @Override  
  37.     protected void onCreate(Bundle savedInstanceState) {  
  38.         super.onCreate(savedInstanceState);  
  39.         requestWindowFeature(Window.FEATURE_NO_TITLE);  
  40.         setContentView(R.layout.activity_login);  
  41. //QQ第三方登录  
  42.         mTencent = Tencent.createInstance("123123123",getApplicationContext());//这里的“123123123”改为自己的Appid  
  43.         QQlogin = (ImageView) findViewById(R.id.login_image_QQlogin);  
  44.         QQlogin.setOnClickListener(new View.OnClickListener() {  
  45.             @Override  
  46.             public void onClick(View v) {  
  47.                 //get_simple_userinfo  
  48.                 mTencent.login(LoginActivity.this,"all",new BaseUiListener());  
  49.             }  
  50.         });  
  51.     }  
  52.   
  53.     @Override  
  54.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  55.         super.onActivityResult(requestCode, resultCode, data);  
  56.   
  57.         Tencent.onActivityResultData(requestCode, resultCode, data, new BaseUiListener());  
  58.   
  59.         if(requestCode == Constants.REQUEST_API) {  
  60.             if(resultCode == Constants.REQUEST_LOGIN) {  
  61.                 Tencent.handleResultData(data, new BaseUiListener());  
  62.             }  
  63.         }  
  64.   
  65.     }  
  66.   
  67.     private class BaseUiListener implements IUiListener {  
  68.         public void onComplete(Object response) {  
  69.             // TODO Auto-generated method stub  
  70.             Toast.makeText(getApplicationContext(), "登录成功", Toast.LENGTH_SHORT).show();  
  71.             /*  
  72.             * 下面隐藏的是用户登录成功后 登录用户数据的获取的方法  
  73.             * 共分为两种  一种是简单的信息的获取,另一种是通过UserInfo类获取用户较为详细的信息  
  74.             *有需要看看  
  75.             * */  
  76.           /*  try {  
  77.                 //获得的数据是JSON格式的,获得你想获得的内容  
  78.                 //如果你不知道你能获得什么,看一下下面的LOG  
  79.                 Log.v("----TAG--", "-------------"+response.toString());  
  80.                 openidString = ((JSONObject) response).getString("openid");  
  81.                 mTencent.setOpenId(openidString);  
  82.   
  83.                 mTencent.setAccessToken(((JSONObject) response).getString("access_token"),((JSONObject) response).getString("expires_in"));  
  84.   
  85.   
  86.                 Log.v("TAG", "-------------"+openidString);  
  87.                 //access_token= ((JSONObject) response).getString("access_token");              //expires_in = ((JSONObject) response).getString("expires_in");  
  88.             } catch (JSONException e) {  
  89.                 // TODO Auto-generated catch block  
  90.                 e.printStackTrace();  
  91.             }  
  92.             *//**到此已经获得OpneID以及其他你想获得的内容了  
  93.              QQ登录成功了,我们还想获取一些QQ的基本信息,比如昵称,头像什么的,这个时候怎么办?  
  94.              sdk给我们提供了一个类UserInfo,这个类中封装了QQ用户的一些信息,我么可以通过这个类拿到这些信息  
  95.              如何得到这个UserInfo类呢?  *//*  
  96.   
  97.             QQToken qqToken = mTencent.getQQToken();  
  98.             UserInfo info = new UserInfo(getApplicationContext(), qqToken);  
  99.   
  100.             //    info.getUserInfo(new BaseUIListener(this,"get_simple_userinfo"));  
  101.             info.getUserInfo(new IUiListener() {  
  102.                 @Override  
  103.                 public void onComplete(Object o) {  
  104.                     //用户信息获取到了  
  105.   
  106.                     try {  
  107.   
  108.                         Toast.makeText(getApplicationContext(), ((JSONObject) o).getString("nickname")+((JSONObject) o).getString("gender"), Toast.LENGTH_SHORT).show();  
  109.                         Log.v("UserInfo",o.toString());  
  110.                         Intent intent1 = new Intent(LoginActivity.this,MainActivity.class);  
  111.                         startActivity(intent1);  
  112.                         finish();  
  113.                     } catch (JSONException e) {  
  114.                         // TODO Auto-generated catch block  
  115.                         e.printStackTrace();  
  116.                     }  
  117.                 }  
  118.   
  119.                 @Override  
  120.                 public void onError(UiError uiError) {  
  121.                     Log.v("UserInfo","onError");  
  122.                 }  
  123.   
  124.                 @Override  
  125.                 public void onCancel() {  
  126.                     Log.v("UserInfo","onCancel");  
  127.                 }  
  128.             });*/  
  129.   
  130.         }  
  131.   
  132.         @Override  
  133.         public void onError(UiError uiError) {  
  134.             Toast.makeText(getApplicationContext(), "onError", Toast.LENGTH_SHORT).show();  
  135.         }  
  136.   
  137.         @Override  
  138.         public void onCancel() {  
  139.             Toast.makeText(getApplicationContext(), "onCancel", Toast.LENGTH_SHORT).show();  
  140.         }  
  141.   
  142.   
  143.     }  
  144.   
  145. }  

猜你喜欢

转载自blog.csdn.net/zhang1223665986/article/details/80628763