Android实现QQ第三方登录
Tag标签:第三方
Android 实现QQ第三方登录
在项目中需要实现QQ第三方登录,经过一番努力算是写出来了,现在总结以下,以防以后遗忘,能帮到其他童鞋就更好了。
首先肯定是去下载SDK和DEMO
http://wiki.open.qq.com/wiki/mobile/SDK下载
本文是我自己整合后的简单DEMO。
先看下效果图吧
![]()
![]()
![]()
![]()
![]()
原理:我们要使用QQ登录我们的应用,不是不用注册,是我们在后台为用户注册了,但是用户不知道,注册需要唯一标识,上图的那串字母与数字的组合就是我们要获得的唯一标识:OpenID.
跟着代码来说吧。
首先,我们要加载open_sdk.jar和mta-sdk-1.00.jar这两个架包顺便看下我总共用到的类
![]()
![]()
其中,AppConstant中是用来放置APPID的,由于考虑到还可能引入其他第三方登录,为方便管理,故创建此类。Util是根据路径从网上获取图片的处理类
好了进入主题
首先在AndroidManifest.xml中进行两个定义如果不定义是不行的
01.<activity02.android:name="com.tencent.tauth.AuthActivity"03.android:launchMode="singleTask"04.android:noHistory="true">05.<intent-filter>06.<action android:name="android.intent.action.VIEW"/>07.08.<category android:name="android.intent.category.DEFAULT"/>09.<category android:name="android.intent.category.BROWSABLE"/>10.11.<data android:scheme="tencent222222"/><!—注意在这里用你的appid替换222222-->12.</intent-filter>13.</activity>14.<activity android:name="com.tencent.connect.common.AssistActivity"15.android:theme="@android:style/Theme.Translucent.NoTitleBar"16.android:screenOrientation="portrait"/>然后是两个权限
1.<uses-permission android:name="android.permission.INTERNET"/>2.<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>接下来是布局文件,activity_main.xml登录按钮,获取头像、昵称、openid的textview
01.<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"02.xmlns:tools="http://schemas.android.com/tools"03.android:layout_width="fill_parent"04.android:layout_height="fill_parent"05.android:orientation="vertical">06.<Button07.android:id="@+id/login"08.android:layout_width="fill_parent"09.android:layout_height="wrap_content"10.android:text="登录"/>11.<ImageView12.android:id="@+id/user_logo"13.android:layout_width="wrap_content"14.android:layout_height="wrap_content"15./>16.<TextView17.android:id="@+id/user_nickname"18.android:layout_width="wrap_content"19.android:layout_height="wrap_content"20.android:textColor="#80505050"21.android:textSize="18sp"22./>23.<TextView24.android:id="@+id/user_openid"25.android:layout_width="wrap_content"26.android:layout_height="wrap_content"27./>28.29.</LinearLayout>然后是MainActivity
01.publicclassMainActivityextendsActivityimplementsOnClickListener {02.TextView openidTextView;03.TextView nicknameTextView;04.Button loginButton;05.ImageView userlogo;06.privateTencent mTencent;07.publicstaticQQAuth mQQAuth;08.publicstaticString mAppid;09.publicstaticString openidString;10.publicstaticString nicknameString;11.publicstaticString TAG="MainActivity";12.Bitmap bitmap =null;13.@Override14.publicvoidonCreate(Bundle savedInstanceState) {15.super.onCreate(savedInstanceState);16.setContentView(R.layout.activity_main);17.//用来登录的Button18.loginButton=(Button)findViewById(R.id.login);19.loginButton.setOnClickListener(this);20.//用来显示OpenID的textView21.openidTextView=(TextView)findViewById(R.id.user_openid);22.//用来显示昵称的textview23.nicknameTextView=(TextView)findViewById(R.id.user_nickname);24.//用来显示头像的Imageview25.userlogo=(ImageView)findViewById(R.id.user_logo);26.27.}28.publicvoidonClick(View v) {29.// TODO Auto-generated method stub30.switch(v.getId()) {31.caseR.id.login:32.LoginQQ();33.break;34.35.default:36.break;37.}38.}39.//这里是调用QQ登录的关键代码40.publicvoidLoginQQ() {41.//这里的APP_ID请换成你应用申请的APP_ID,我这里使用的是DEMO中官方提供的测试APP_ID 22222242.mAppid = AppConstant.APP_ID;43.//第一个参数就是上面所说的申请的APPID,第二个是全局的Context上下文,这句话实现了调用QQ登录44.mTencent = Tencent.createInstance(mAppid,getApplicationContext());45./**通过这句代码,SDK实现了QQ的登录,这个方法有三个参数,第一个参数是context上下文,第二个参数SCOPO 是一个String类型的字符串,表示一些权限46.官方文档中的说明:应用需要获得哪些API的权限,由“,”分隔。例如:SCOPE = “get_user_info,add_t”;所有权限用“all”47.第三个参数,是一个事件监听器,IUiListener接口的实例,这里用的是该接口的实现类 */48.mTencent.login(MainActivity.this,"all",newBaseUiListener());49.50.}51./**当自定义的监听器实现IUiListener接口后,必须要实现接口的三个方法,52.* onComplete onCancel onError53.*分别表示第三方登录成功,取消 ,错误。*/54.privateclassBaseUiListenerimplementsIUiListener {55.56.publicvoidonCancel() {57.// TODO Auto-generated method stub58.59.}60.publicvoidonComplete(Object response) {61.// TODO Auto-generated method stub62.Toast.makeText(getApplicationContext(),"登录成功",0).show();63.try{64.//获得的数据是JSON格式的,获得你想获得的内容65.//如果你不知道你能获得什么,看一下下面的LOG66.Log.e(TAG,"-------------"+response.toString());67.openidString = ((JSONObject) response).getString("openid");68.openidTextView.setText(openidString);69.Log.e(TAG,"-------------"+openidString);70.//access_token= ((JSONObject) response).getString("access_token"); //expires_in = ((JSONObject) response).getString("expires_in");71.}catch(JSONException e) {72.// TODO Auto-generated catch block73.e.printStackTrace();74.}75./**到此已经获得OpneID以及其他你想获得的内容了76.QQ登录成功了,我们还想获取一些QQ的基本信息,比如昵称,头像什么的,这个时候怎么办?77.sdk给我们提供了一个类UserInfo,这个类中封装了QQ用户的一些信息,我么可以通过这个类拿到这些信息78.如何得到这个UserInfo类呢? */79.Q<a href="http://www.it165.net/pro/pkqt/"target="_blank"class="keylink">QT</a>oken qqToken = mTencent.getQ<a href="http://www.it165.net/pro/pkqt/"target="_blank"class="keylink">QT</a>oken();80.UserInfo info =newUserInfo(getApplicationContext(), <a href="http://www.it165.net/qq/"target="_blank"class="keylink">qq</a>Token);81.//这样我们就拿到这个类了,之后的操作就跟上面的一样了,同样是解析JSON01.info.getUserInfo(newIUiListener() {02.03.publicvoidonComplete(finalObject response) {04.// TODO Auto-generated method stub05.Log.e(TAG,"---------------111111");06.Message msg =newMessage();07.msg.obj = response;08.msg.what =0;09.mHandler.sendMessage(msg);10.Log.e(TAG,"-----111---"+response.toString());11./**由于图片需要下载所以这里使用了线程,如果是想获得其他文字信息直接12.* 在mHandler里进行操作13.*14.*/15.newThread(){16.17.@Override18.publicvoidrun() {19.// TODO Auto-generated method stub20.JSONObject json = (JSONObject)response;21.try{22.bitmap = Util.getbitmap(json.getString("figureurl_<a href="http://www.it165.net/qq/" target="_blank" class="keylink">qq</a>_2"));23.}catch(JSONException e) {24.// TODO Auto-generated catch block25.e.printStackTrace();26.}27.Message msg =newMessage();28.msg.obj = bitmap;29.msg.what =1;30.mHandler.sendMessage(msg);31.}32.}.start();33.}34.publicvoidonCancel() {35.Log.e(TAG,"--------------111112");36.// TODO Auto-generated method stub37.}38.publicvoidonError(UiError arg0) {39.// TODO Auto-generated method stub40.Log.e(TAG,"-111113"+":"+arg0);41.}42.43.});44.45.}46.47.publicvoidonError(UiError arg0) {48.// TODO Auto-generated method stub49.50.}51.52.}53.Handler mHandler =newHandler() {54.55.@Override56.publicvoidhandleMessage(Message msg) {57.if(msg.what ==0) {58.JSONObject response = (JSONObject) msg.obj;59.if(response.has("nickname")) {60.try{61.nicknameString=response.getString("nickname");62.63.nicknameTextView.setText(nicknameString);64.Log.e(TAG,"--"+nicknameString);65.}catch(JSONException e) {66.// TODO Auto-generated catch block67.e.printStackTrace();68.}69.}70.}elseif(msg.what ==1){71.Bitmap bitmap = (Bitmap)msg.obj;72.userlogo.setImageBitmap(bitmap);73.74.}75.}76.77.};78.79.80.}![]()
上图是登录Q的返回LOG
![]()
上图是我们获得腾讯提供的UserInfo返回的LOG
然后是AppConstant.java
1.publicclassAppConstant {2.publicstaticString APP_ID="222222";3.}然后是Util.java
01.publicclassUtil {02.publicstaticString TAG="UTIL";03.publicstaticBitmap getbitmap(String imageUri) {04.Log.v(TAG,"getbitmap:"+ imageUri);05.// 显示网络上的图片06.Bitmap bitmap =null;07.try{08.URL myFileUrl =newURL(imageUri);09.HttpURLConnection conn = (HttpURLConnection) myFileUrl10..openConnection();11.conn.setDoInput(true);12.conn.connect();13.InputStream is = conn.getInputStream();14.bitmap = BitmapFactory.decodeStream(is);15.is.close();16.17.Log.v(TAG,"image download finished."+ imageUri);18.}catch(IOException e) {19.e.printStackTrace();20.Log.v(TAG,"getbitmap bmp fail---");21.returnnull;22.}23.returnbitmap;24.}25.}至此全部代码就在这里了,我们获得了OpenID这个唯一标识最关键的东西,然后看项目中需要登录的接口还需要什么信息,获取到就能实现登陆了。
结束。










结束。
浙公网安备 33010602011771号