qq平台登錄
在APP開發過程中,時常會用到第三方賬號登錄體係。
下麵,簡要說明QQ的第三方登錄體係在Android平台上的運用。
申請APPID
進入QQ互聯的官網,https://connect.qq.com/
在管理中心中創建移動應用。
創建完成後,可以得到APPID。
並在下方的協作者測試號中,填寫控應用測試用的QQ號碼。
導入Jar包
將下載得到的Jar包導入工程,並在AndroidManifest.xml文件中進行注冊。
- <activity
- android:name="com.tencent.tauth.AuthActivity"
- android:noHistory="true"
- android:launchMode="singleTask" >
- <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="tencent100546930" />
- </intent-filter>
- </activity>
其中,<data android:scheme="tencent100546930" />中的數字需要替換成自己申請得到的APPID。
創建登錄接口
所有的SDK接口調用,都會傳入一個回調,用以接收SDK返回的調用結果。回調的主要接口有兩種:
(1) IUiListener:調用SDK已經封裝好的接口時,例如:登錄、快速支付登錄、應用分享、應用邀請等接口。
(2) IRequestListener:使用requestAsync、request等通用方法調用sdk未封裝的接口時,例如上傳圖片、查看相冊等。
在這裏創建IUiListener接口實現相應的登錄授權操作:- private void onClickLogin() {
- if (!mTencent.isSessionValid()) {
- IUiListener listener = new IUiListener() {
- /** 授權失敗的回調*/
- @Override
- public void onError(UiError arg0) {
- // TODO Auto-generated method stub
- Toast.makeText(LoginActivity.this, "授權失敗", 1000).show();
- Message msg = new Message();
- msg.arg1 = 2;
- handler.sendMessage(msg);
- }
- /** 授權成功的回調*/
- @Override
- public void onComplete(JSONObject arg0) {
- // TODO Auto-generated method stub
- Toast.makeText(LoginActivity.this, "授權成功", 1000).show();
- Message msg = new Message();
- msg.what = 2;
- msg.arg1 = 1;
- msg.obj = arg0;
- handler.sendMessage(msg);
- }
- /** 取消授權的回調*/
- @Override
- public void onCancel() {
- // TODO Auto-generated method stub
- Toast.makeText(LoginActivity.this, "取消授權", 1000).show();
- Message msg = new Message();
- msg.arg1 = 3;
- handler.sendMessage(msg);
- }
- };
- mTencent.login(this, SCOPE, listener);
- } else {
- mTencent.logout(this);
- }
- }
其中,mTencent為QQSDK主要實現類Tencent類的實例。
- // Tencent類是SDK的主要實現類,開發者可通過Tencent類訪問騰訊開放的OpenAPI。
- // 其中APP_ID是分配給第三方應用的appid,類型為String。
- mTencent = Tencent.createInstance(APP_ID, this.getApplicationContext());
將handler進行實例化
- handler = new Handler(this);
並將類實現Callback接口,即可對上述類進行Handler的處理操作。
- @Override
- public boolean handleMessage(Message msg) {
- // TODO Auto-generated method stub
- switch (msg.arg1) {
- case 1: { // 成功
- JSONObject object = (JSONObject) msg.obj;
- try {
- openid = object.getString("openid").toString();
- sBuilder.append("openid為:"+openid+"\n");
- access_token = object.getString("access_token").toString();
- url = url + "?access_token="+access_token+"&oauth_consumer_key="+APP_ID+
- "&openmargin:0px;padding:0px;border:none;background-color:inherit;">+openid+"&format=json";
- new MyUrlThread(url.toString(), 2,sHandler).start();
- } catch (JSONException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- break;
- case 2: { // 失敗
- Toast.makeText(this, "", Toast.LENGTH_SHORT).show();
- return false;
- }
- case 3: { // 取消
- Toast.makeText(this, "", Toast.LENGTH_SHORT).show();
- return false;
- }
- }
- return false;
- }
如果授權成功,即可得到返回的Openid。
從而,可以根據Openid調用騰訊所提供的官方接口,實現需要的操作。
接收回調
- //應用調用Andriod_SDK接口時,使能成功接收到回調
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- // TODO Auto-generated method stub
應用實例代碼
- package com.test.wotao;
- import java.io.IOException;
- import java.net.MalformedURLException;
- import java.net.URL;
- import org.json.JSONException;
- import org.json.JSONObject;
- import com.tencent.plus.TouchView;
- import com.tencent.tauth.IUiListener;
- import com.tencent.tauth.Tencent;
- import com.tencent.tauth.UiError;
- import com.test.util.MyApplication;
- import com.test.util.MyThread;
- import com.test.util.MyUrlThread;
- import android.annotation.SuppressLint;
- import android.app.Activity;
- import android.content.Intent;
- import android.graphics.drawable.Drawable;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Handler.Callback;
- import android.os.Message;
- import android.os.StrictMode;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.view.inputmethod.BaseInputConnection;
- import android.widget.Button;
- import android.widget.CheckedTextView;
- import android.widget.ImageView;
- import android.widget.TextView;
- import android.widget.Toast;
- /**
- * 創建時間:2013-10-30
- APP ID:100546930
- APP KEY:6ff068cfbae8fa0b53f9a3c27f1af321
- * @author 402-9
- *
- */
- public class LoginActivity extends Activity implements OnClickListener,Callback{
- private Button login_qq;
- private TextView nickname;
- private ImageView image;
- private Tencent mTencent;
- private String imageurl;
- String url_qqlogin;
- private String openid;
- private String access_token;
- private String SCOPE = "get_simple_userinfo,add_topic";
- private static final String APP_ID = "100546930";
- private String url = "https://graph.qq.com/user/get_user_info";
- private Handler handler;
- private StringBuilder sBuilder = new StringBuilder();
- private Handler sHandler = new Handler(){
- public void handleMessage(Message msg) {
- if (msg.what == 2) {
- String result = msg.obj.toString();
- JSONObject data;
- try {
- data = new JSONObject(result);
- String ret = data.getString("ret");
- String messsage = data.getString("msg");
- if (Integer.valueOf(ret) == 0) {
- String name = data.getString("nickname");
- sBuilder.append("nickname為:"+name+"\n");
- String gender = data.getString("gender");
- sBuilder.append("gender為:"+gender+"\n");
- imageurl = data.getString("figureurl_1");
- sBuilder.append("imageurl為:"+imageurl+"\n");
- // image.setImageDrawable(Drawable.createFromStream(new URL(imageurl).openConnection()
- // .getInputStream(), "src"));
- url_qqlogin = "jiekou.php?code=qq_user&nickname="+name+"&email="+name+
- "@qq.com&figureurl="+imageurl+"&sex="+gender+
- "&openmargin:0px;padding:0px;border:none;background-color:inherit;">+openid+"&accesstoken="+access_token;
- System.out.println("url_qqlogin----"+url_qqlogin);
- new MyThread(url_qqlogin.toString(), 1,qqHandler).start();
- }
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- System.out.println("sBuilder---"+sBuilder);
- nickname.setText(sBuilder);
- }
- };
- };
- private Handler qqHandler = new Handler(){
- public void handleMessage(Message msg) {
- if (msg.what==1) {
- String result = msg.obj.toString();
- JSONObject data;
- try {
- data = new JSONObject(result);
- String nickname = data.getString("nickname");
- String message = data.getString("msg");
- sBuilder.append("QQ的nickname為:"+nickname+"\n");
- sBuilder.append("QQ的message為:"+message+"\n");
- System.out.println("333==="+sBuilder);
- Toast.makeText(LoginActivity.this, message, 1000).show();
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- nickname.setText(sBuilder);
- }
- };
- };
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- setContentView(R.layout.login_qq);
- handler = new Handler(this);
- // Tencent類是SDK的主要實現類,開發者可通過Tencent類訪問騰訊開放的OpenAPI。
- // 其中APP_ID是分配給第三方應用的appid,類型為String。
- mTencent = Tencent.createInstance(APP_ID, this.getApplicationContext());
- login_qq = (Button) findViewById(R.id.login_qq);
- login_qq.setOnClickListener(this);
- nickname = (TextView) findViewById(R.id.nickname);
- image = (ImageView) findViewById(R.id.image);
- }
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- switch (v.getId()) {
- case R.id.login_qq:
- onClickLogin();
- break;
- }
- }
- //應用調用Andriod_SDK接口時,使能成功接收到回調
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- // TODO Auto-generated method stub
- mTencent.onActivityResult(requestCode, resultCode, data);
- }
- private void onClickLogin() {
- if (!mTencent.isSessionValid()) {
- IUiListener listener = new IUiListener() {
- /** 授權失敗的回調*/
- @Override
- public void onError(UiError arg0) {
- // TODO Auto-generated method stub
- Toast.makeText(LoginActivity.this, "授權失敗", 1000).show();
- Message msg = new Message();
- msg.arg1 = 2;
- handler.sendMessage(msg);
- }
- /** 授權成功的回調*/
- @Override
- public void onComplete(JSONObject arg0) {
- // TODO Auto-generated method stub
- Toast.makeText(LoginActivity.this, "授權成功", 1000).show();
- Message msg = new Message();
- msg.what = 2;
- msg.arg1 = 1;
- msg.obj = arg0;
- handler.sendMessage(msg);
- }
- /** 取消授權的回調*/
- @Override
- public void onCancel() {
- // TODO Auto-generated method stub
- Toast.makeText(LoginActivity.this, "取消授權", 1000).show();
- Message msg = new Message();
- msg.arg1 = 3;
- handler.sendMessage(msg);
- }
- };
- mTencent.login(this, SCOPE, listener);
- } else {
- mTencent.logout(this);
- }
- }
- @Override
- public boolean handleMessage(Message msg) {
- // TODO Auto-generated method stub
- switch (msg.arg1) {
- case 1: { // 成功
- JSONObject object = (JSONObject) msg.obj;
- try {
- openid = object.getString("openid").toString();
- sBuilder.append("openid為:"+openid+"\n");
- access_token = object.getString("access_token").toString();
- url = url + "?access_token="+access_token+"&oauth_consumer_key="+APP_ID+
- "&openmargin:0px;padding:0px;border:none;background-color:inherit;">+openid+"&format=json";
- new MyUrlThread(url.toString(), 2,sHandler).start();
- } catch (JSONException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- break;
- case 2: { // 失敗
- Toast.makeText(this, "", Toast.LENGTH_SHORT).show();
- return false;
- }
- case 3: { // 取消
- Toast.makeText(this, "", Toast.LENGTH_SHORT).show();
- return false;
- }
- }
- return false;
- }
- }
最後更新:2017-04-03 12:55:42