• 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)方法就能够了。

  • 相关阅读:
    Django中使用Celery实现异步任务队列
    使用Pyenv + pipenv来管理python版本和虚拟环境
    Django设置DEBUG=False后静态文件无法加载
    翕的来历
    Dubbo:基本原理机制
    数据库事务特性及隔离机制再到spring事务管理
    通过rocketmq思考一下mq的设计取舍
    redis的一些特性
    redis的快速机制与数据类型
    Zookeeper选举算法原理
  • 原文地址:https://www.cnblogs.com/lxjshuju/p/6874069.html
Copyright © 2020-2023  润新知