【Android】第三方QQ账号登录的实现
16lz
2021-01-24
在APP开发过程中,时常会用到第三方账号登录体系。
下面,简要说明QQ的第三方登录体系在Android平台上的运用。
申请APPID
进入QQ互联的官网,http://connect.qq.com/
在管理中心中创建移动应用。
创建完成后,可以得到APPID。
并在下方的协作者测试号中,填写控应用测试用的QQ号码。
导入Jar包
将下载得到的Jar包导入工程,并在AndroidManifest.xml文件中进行注册。
<activityandroid:name="com.tencent.tauth.AuthActivity"android:noHistory="true"android:launchMode="singleTask"><intent-filter><actionandroid:name="android.intent.action.VIEW"/><categoryandroid:name="android.intent.category.DEFAULT"/><categoryandroid:name="android.intent.category.BROWSABLE"/><dataandroid:scheme="tencent100546930"/></intent-filter></activity>
其中,<data android:scheme="tencent100546930" />中的数字需要替换成自己申请得到的APPID。
创建登录接口
所有的SDK接口调用,都会传入一个回调,用以接收SDK返回的调用结果。回调的主要接口有两种:
(1)IUiListener:调用SDK已经封装好的接口时,例如:登录、快速支付登录、应用分享、应用邀请等接口。
(2)IRequestListener:使用requestAsync、request等通用方法调用sdk未封装的接口时,例如上传图片、查看相册等。
在这里创建IUiListener接口实现相应的登录授权操作:
privatevoidonClickLogin(){if(!mTencent.isSessionValid()){IUiListenerlistener=newIUiListener(){/**授权失败的回调*/@OverridepublicvoidonError(UiErrorarg0){//TODOAuto-generatedmethodstubToast.makeText(LoginActivity.this,"授权失败",1000).show();Messagemsg=newMessage();msg.arg1=2;handler.sendMessage(msg);}/**授权成功的回调*/@OverridepublicvoidonComplete(JSONObjectarg0){//TODOAuto-generatedmethodstubToast.makeText(LoginActivity.this,"授权成功",1000).show();Messagemsg=newMessage();msg.what=2;msg.arg1=1;msg.obj=arg0;handler.sendMessage(msg);}/**取消授权的回调*/@OverridepublicvoidonCancel(){//TODOAuto-generatedmethodstubToast.makeText(LoginActivity.this,"取消授权",1000).show();Messagemsg=newMessage();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=newHandler(this);
并将类实现Callback接口,即可对上述类进行Handler的处理操作。
@OverridepublicbooleanhandleMessage(Messagemsg){//TODOAuto-generatedmethodstubswitch(msg.arg1){case1:{//成功JSONObjectobject=(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+"&openid="+openid+"&format=json";newMyUrlThread(url.toString(),2,sHandler).start();}catch(JSONExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}break;case2:{//失败Toast.makeText(this,"",Toast.LENGTH_SHORT).show();returnfalse;}case3:{//取消Toast.makeText(this,"",Toast.LENGTH_SHORT).show();returnfalse;}}returnfalse;}
如果授权成功,即可得到返回的Openid。
从而,可以根据Openid调用腾讯所提供的官方接口,实现需要的操作。
接收回调
//应用调用Andriod_SDK接口时,使能成功接收到回调@OverrideprotectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){//TODOAuto-generatedmethodstub
应用实例代码
packagecom.test.wotao;importjava.io.IOException;importjava.net.MalformedURLException;importjava.net.URL;importorg.json.JSONException;importorg.json.JSONObject;importcom.tencent.plus.TouchView;importcom.tencent.tauth.IUiListener;importcom.tencent.tauth.Tencent;importcom.tencent.tauth.UiError;importcom.test.util.MyApplication;importcom.test.util.MyThread;importcom.test.util.MyUrlThread;importandroid.annotation.SuppressLint;importandroid.app.Activity;importandroid.content.Intent;importandroid.graphics.drawable.Drawable;importandroid.os.Bundle;importandroid.os.Handler;importandroid.os.Handler.Callback;importandroid.os.Message;importandroid.os.StrictMode;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.view.inputmethod.BaseInputConnection;importandroid.widget.Button;importandroid.widget.CheckedTextView;importandroid.widget.ImageView;importandroid.widget.TextView;importandroid.widget.Toast;/***创建时间:2013-10-30APPID:100546930APPKEY:6ff068cfbae8fa0b53f9a3c27f1af321*@author402-9**/publicclassLoginActivityextendsActivityimplementsOnClickListener,Callback{privateButtonlogin_qq;privateTextViewnickname;privateImageViewimage;privateTencentmTencent;privateStringimageurl;Stringurl_qqlogin;privateStringopenid;privateStringaccess_token;privateStringSCOPE="get_simple_userinfo,add_topic";privatestaticfinalStringAPP_ID="100546930";privateStringurl="https://graph.qq.com/user/get_user_info";privateHandlerhandler;privateStringBuildersBuilder=newStringBuilder();privateHandlersHandler=newHandler(){publicvoidhandleMessage(Messagemsg){if(msg.what==2){Stringresult=msg.obj.toString();JSONObjectdata;try{data=newJSONObject(result);Stringret=data.getString("ret");Stringmesssage=data.getString("msg");if(Integer.valueOf(ret)==0){Stringname=data.getString("nickname");sBuilder.append("nickname为:"+name+"\n");Stringgender=data.getString("gender");sBuilder.append("gender为:"+gender+"\n");imageurl=data.getString("figureurl_1");sBuilder.append("imageurl为:"+imageurl+"\n");//image.setImageDrawable(Drawable.createFromStream(newURL(imageurl).openConnection()//.getInputStream(),"src"));url_qqlogin="jiekou.php?code=qq_user&nickname="+name+"&email="+name+"@qq.com&figureurl="+imageurl+"&sex="+gender+"&openid="+openid+"&accesstoken="+access_token;System.out.println("url_qqlogin----"+url_qqlogin);newMyThread(url_qqlogin.toString(),1,qqHandler).start();}}catch(Exceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}System.out.println("sBuilder---"+sBuilder);nickname.setText(sBuilder);}};};privateHandlerqqHandler=newHandler(){publicvoidhandleMessage(Messagemsg){if(msg.what==1){Stringresult=msg.obj.toString();JSONObjectdata;try{data=newJSONObject(result);Stringnickname=data.getString("nickname");Stringmessage=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(Exceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}nickname.setText(sBuilder);}};};@OverrideprotectedvoidonCreate(BundlesavedInstanceState){//TODOAuto-generatedmethodstubsuper.onCreate(savedInstanceState);setContentView(R.layout.login_qq);handler=newHandler(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);}@OverridepublicvoidonClick(Viewv){//TODOAuto-generatedmethodstubswitch(v.getId()){caseR.id.login_qq:onClickLogin();break;}}//应用调用Andriod_SDK接口时,使能成功接收到回调@OverrideprotectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){//TODOAuto-generatedmethodstubmTencent.onActivityResult(requestCode,resultCode,data);}privatevoidonClickLogin(){if(!mTencent.isSessionValid()){IUiListenerlistener=newIUiListener(){/**授权失败的回调*/@OverridepublicvoidonError(UiErrorarg0){//TODOAuto-generatedmethodstubToast.makeText(LoginActivity.this,"授权失败",1000).show();Messagemsg=newMessage();msg.arg1=2;handler.sendMessage(msg);}/**授权成功的回调*/@OverridepublicvoidonComplete(JSONObjectarg0){//TODOAuto-generatedmethodstubToast.makeText(LoginActivity.this,"授权成功",1000).show();Messagemsg=newMessage();msg.what=2;msg.arg1=1;msg.obj=arg0;handler.sendMessage(msg);}/**取消授权的回调*/@OverridepublicvoidonCancel(){//TODOAuto-generatedmethodstubToast.makeText(LoginActivity.this,"取消授权",1000).show();Messagemsg=newMessage();msg.arg1=3;handler.sendMessage(msg);}};mTencent.login(this,SCOPE,listener);}else{mTencent.logout(this);}}@OverridepublicbooleanhandleMessage(Messagemsg){//TODOAuto-generatedmethodstubswitch(msg.arg1){case1:{//成功JSONObjectobject=(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+"&openid="+openid+"&format=json";newMyUrlThread(url.toString(),2,sHandler).start();}catch(JSONExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}break;case2:{//失败Toast.makeText(this,"",Toast.LENGTH_SHORT).show();returnfalse;}case3:{//取消Toast.makeText(this,"",Toast.LENGTH_SHORT).show();returnfalse;}}returnfalse;}}
更多相关文章
- Android(安卓)判断系统用户无操作
- android记帐本、涂鸦、仿腾讯新闻、仿bilibili、Markdwon便签、
- Android中ContentProvider和ContentResolver使用入门
- Android中的进程(Process)和线程(Thread)
- Android系统操作的50个实用技巧
- Android(安卓)ArrayList LinkedList Set HashMap的介绍.
- android网络通信之-Http(Android操作HTTP实现与服务器通信)
- 详解Android接口Interface的使用和意义
- Android官方命令深入分析之bmgr