Android 调用QQ登录

调用QQ登录

       在如今的项目开发。调用第三方登录。差点儿是必须的,而调用QQ登录也是不可缺少的,这里把相关代码分享出来,希望能拿去就能够用,降低项目开发的时间。希望对大家实用。

1,去QQ开放平台注冊帐号(http://open.qq.com/)。为应用申请QQ的APP_ID , 并下载相关的jar包,放到project的lib文件夹下。

2,在Manifest.xml里注冊QQ相关的Activity,代码例如以下
  
        <activity
        android:name="com.tencent.connect.common.AssistActivity"
        android:screenOrientation="portrait"
        android:theme="@android:style/Theme.Translucent.NoTitleBar" />        
        <activity
        android:name="com.tencent.tauth.AuthActivity"
        android:launchMode="singleTask"
        android:noHistory="true" >
            <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="tencent100491239" />
            </intent-filter>
        </activity> 

3,利用QQ提供的相关API去获取相关的OPENID,昵称。图像等资料。这里有一点要注意的是,因为QQserver返回OPENID和昵称等其它资料是分两步进行的,而首先返回的              OPENID速度非常快,返回昵称等其它资料可能会比較慢,所以在返回OPENID的时候,就能够觉得已经调用QQ登录成功,再用异步的方式处理昵称等其它资料信息。

下面是代码部 分。已经过项目測试,可直接用(替换对应的APP_ID就能够了)

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.SocketTimeoutException;

import org.apache.http.conn.ConnectTimeoutException;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;

import com.smart.util.BroadcastAction;
import com.smart.util.BroadcastUtil;
import com.smart.util.Constant;
import com.smart.util.ILog;
import com.smart.util.PrefUtil;
import com.smart.util.Prefkey;
import com.tencent.open.HttpStatusException;
import com.tencent.open.NetworkUnavailableException;
import com.tencent.tauth.Constants;
import com.tencent.tauth.IRequestListener;
import com.tencent.tauth.IUiListener;
import com.tencent.tauth.Tencent;
import com.tencent.tauth.UiError;
import com.utils.lib.ss.common.ToastHelper;

/**
 * QQ登陆。
 * @author E
 */
public class QqLogin {
	
	private static QqLogin qqLogin = null;
	
	public static QqLogin getInstance(){
		if (null == qqLogin) {
			qqLogin = new QqLogin();
		}
		return qqLogin;
	}
	
	public void login(Activity context , QqLoginListener loginListener){
	    //Constant.QQ_APP_ID 这里要替换成自己申请的APP_ID
		Tencent tencent = Tencent.createInstance(Constant.QQ_APP_ID, context);
		if (null == tencent) {
			ToastHelper.makeText(context, "error cased !");
			return;
		}
		tencent.login(context, "get_user_info", new BaseUiListener(tencent,loginListener));
	}
	
	class BaseUiListener implements IUiListener{

		Tencent tencent = null;
		QqLoginListener qqLoginListener = null;
		
		public BaseUiListener(Tencent tencent ,QqLoginListener qqLoginListener) {
			super();
			this.tencent = tencent;
			this.qqLoginListener = qqLoginListener;
		}

		@Override
		public void onComplete(JSONObject values) {
			try {
				String openid = values.getString("openid");
				qqLoginListener.onLoginSuccess(openid);
				tencent.requestAsync(Constants.GRAPH_SIMPLE_USER_INFO, null, Constants.HTTP_GET, 
						new BaseApiListener(qqLoginListener) ,null);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		@Override
		public void onError(UiError arg0) {
			qqLoginListener.onLoginFail();
		}
		
		@Override
		public void onCancel() {
			qqLoginListener.onCancel();
		}
	}
	
	class BaseApiListener implements IRequestListener{
		
		 QqLoginListener qqLoginListener = null;

		public BaseApiListener(QqLoginListener qqLoginListener) {
			super();
			this.qqLoginListener = qqLoginListener;
		}
		@Override
		public void onComplete(JSONObject jsonObject, Object object) {
			try {
				ILog.e(jsonObject.toString());
				String nickName = jsonObject.getString("nickname");
				String figureurl_qq_1 = jsonObject.getString("figureurl_qq_2");
				PrefUtil.instance().setPref(Prefkey.THIRD_NICKNAME, nickName);
				PrefUtil.instance().setPref(Prefkey.THIRD_IMAGE, figureurl_qq_1);
				//发送广播到主页去更新
				BroadcastUtil.sendBroadcast(BroadcastAction.UPLOAD_THIRD_INFO);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		@Override
		public void onConnectTimeoutException(ConnectTimeoutException arg0,
				Object arg1) {
		}
		@Override
		public void onHttpStatusException(HttpStatusException arg0, Object arg1) {
			
		}
		@Override
		public void onIOException(IOException arg0, Object arg1) {
			
		}
		@Override
		public void onJSONException(JSONException arg0, Object arg1) {
			
		}
		@Override
		public void onMalformedURLException(MalformedURLException arg0,
				Object arg1) {
		}
		@Override
		public void onNetworkUnavailableException(
				NetworkUnavailableException arg0, Object arg1) {
		}
		@Override
		public void onSocketTimeoutException(SocketTimeoutException arg0,
				Object arg1) {
		}
		@Override
		public void onUnknowException(Exception arg0, Object arg1) {
		}
	}
	
	/**
	 * 授权完毕后。运行一下步的回调
	 */
	public static abstract class QqLoginListener{
		public void onLoginSuccess(String openid){};
		public void onLoginSuccess(String openid, String nickname){};
		public void onLoginFail(){};
		public void onCancel(){};
	}

      好了,到里代码部分已经写完,仅仅须要调用login(Activity context , QqLoginListener loginListener)方法就能够了。

原文地址:https://www.cnblogs.com/lxjshuju/p/6874069.html