Android 实现QQ第三方登录

欠伸展肢体,吟咏心自愉。这篇文章主要讲述Android 实现QQ第三方登录相关的知识,希望能为你提供帮助。
android 实现QQ第三方登录
【Android 实现QQ第三方登录】在项目中需要实现QQ第三方登录,经过一番努力算是写出来了,现在总结以下,以防以后遗忘,能帮到其他童鞋就更好了。
首先肯定是去下载SDK和DEMO
http://wiki.open.qq.com/wiki/mobile/SDK下载
本文是我自己整合后的简单DEMO。
先看下效果图吧

Android 实现QQ第三方登录

文章图片

小码哥Html5教程,免费随你看 【点击进入】24小时阅读30000+,48小时视频下载50000+ H5,JS,CSS,0基础学完独立开发网站/APP!查 看     
Android 实现QQ第三方登录

文章图片

小码哥Html5教程,免费随你看 【点击进入】24小时阅读30000+,48小时视频下载50000+ H5,JS,CSS,0基础学完独立开发网站/APP!查 看     
Android 实现QQ第三方登录

文章图片

省心选房,上链家网 【点击进入】很多人在【链家】都找到满意的房子! 放心买房 上【链家网】!查 看     
Android 实现QQ第三方登录

文章图片

[尚观]10年品质,高端IT培训 【点击进入】十年运营,9大校区,技术为王,7天免费试学 63214名高薪就业学员,8万年薪就业查 看     
Android 实现QQ第三方登录

文章图片

 
原理:我们要使用QQ登录我们的应用,不是不用注册,是我们在后台为用户注册了,但是用户不知道,注册需要唯一标识,上图的那串字母与数字的组合就是我们要获得的唯一标识:OpenID.
跟着代码来说吧。
首先,我们要加载open_sdk.jar和mta-sdk-1.00.jar这两个架包顺便看下我总共用到的类
Android 实现QQ第三方登录

文章图片
Android 实现QQ第三方登录

文章图片

其中,AppConstant中是用来放置APPID的,由于考虑到还可能引入其他第三方登录,为方便管理,故创建此类。Util是根据路径从网上获取图片的处理类
 
好了进入主题
首先在AndroidManifest.xml中进行两个定义如果不定义是不行的
?
1 2 3 4 5 6 7 8 9 10 11 12                         < intent-filter>                                                                     < category android:name="android.intent.category.DEFAULT">                                 < category android:name="android.intent.category.BROWSABLE">                                   < data android:scheme="tencent222222"> < !--—注意在这里用你的appid替换222222 ---->                         < /data> < /category> < /category> < /action> < /intent-filter>                 < /activity>                   < /activity>
 
然后是两个权限
?
1 2 3 < uses-permission android:name="android.permission.INTERNET">         < uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"> < /uses-permission> < /uses-permission>
 
接下来是布局文件,activity_main.xml登录按钮,获取头像、昵称、openid的textview
?
1 2 3 4 5 6 7 8 < linearlayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical">         < button android:id="@+id/login" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="登录">         < imageview android:id="@+id/user_logo" android:layout_width="wrap_content" android:layout_height="wrap_content">         < textview android:id="@+id/user_nickname" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textcolor="#80505050" android:textsize="18sp">         < textview android:id="@+id/user_openid" android:layout_width="wrap_content" android:layout_height="wrap_content">           < /textview> < /textview> < /imageview> < /button> < /linearlayout>
 
然后是MainActivity
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 public class MainActivity extends Activity implements OnClickListener {         TextView openidTextView;         TextView nicknameTextView;         Button loginButton;         ImageView userlogo;         private Tencent mTencent;         public static QQAuth mQQAuth;             public static String mAppid;             public static String openidString;             public static String nicknameString;             public static String TAG="MainActivity";             Bitmap bitmap = null;         @Override         public void onCreate(Bundle savedInstanceState) {                 super.onCreate(savedInstanceState);                 setContentView(R.layout.activity_main);                 //用来登录的Button                 loginButton=(Button)findViewById(R.id.login);                 loginButton.setOnClickListener(this);                 //用来显示OpenID的textView                 openidTextView=(TextView)findViewById(R.id.user_openid);                 //用来显示昵称的textview                 nicknameTextView=(TextView)findViewById(R.id.user_nickname);               //用来显示头像的Imageview                 userlogo=(ImageView)findViewById(R.id.user_logo);                           }         public void onClick(View v) {                 // TODO Auto-generated method stub                 switch (v.getId()) {                 case R.id.login:                         LoginQQ();                         break;                   default:                         break;                 }         }         //这里是调用QQ登录的关键代码         public void LoginQQ() {                 //这里的APP_ID请换成你应用申请的APP_ID,我这里使用的是DEMO中官方提供的测试APP_ID 222222                 mAppid = AppConstant.APP_ID;                 //第一个参数就是上面所说的申请的APPID,第二个是全局的Context上下文,这句话实现了调用QQ登录                 mTencent = Tencent.createInstance(mAppid,getApplicationContext());                 /**通过这句代码,SDK实现了QQ的登录,这个方法有三个参数,第一个参数是context上下文,第二个参数SCOPO 是一个String类型的字符串,表示一些权限                 官方文档中的说明:应用需要获得哪些API的权限,由“,”分隔。例如:SCOPE = “get_user_info,add_t”;所有权限用“all”                  第三个参数,是一个事件监听器,IUiListener接口的实例,这里用的是该接口的实现类 */                 mTencent.login(MainActivity.this,"all", new BaseUiListener());                                   }         /**当自定义的监听器实现IUiListener接口后,必须要实现接口的三个方法,           * onComplete  onCancel onError           *分别表示第三方登录成功,取消 ,错误。*/         private class BaseUiListener implements IUiListener {                   public void onCancel() {                         // TODO Auto-generated method stub                                           }                 public void onComplete(Object response) {                         // TODO Auto-generated method stub                         Toast.makeText(getApplicationContext(), "登录成功", 0).show();                         try {                                 //获得的数据是JSON格式的,获得你想获得的内容                                 //如果你不知道你能获得什么,看一下下面的LOG                                 Log.e(TAG, "-------------"+response.toString());                                 openidString = ((JSONObject) response).getString("openid");                                 openidTextView.setText(openidString);                                 Log.e(TAG, "-------------"+openidString);                                 //access_token= ((JSONObject) response).getString("access_token");                           //expires_in = ((JSONObject) response).getString("expires_in");                         } catch (JSONException e) {                                 // TODO Auto-generated catch block                                 e.printStackTrace();                         }                         /**到此已经获得OpneID以及其他你想获得的内容了                         QQ登录成功了,我们还想获取一些QQ的基本信息,比如昵称,头像什么的,这个时候怎么办?                         sdk给我们提供了一个类UserInfo,这个类中封装了QQ用户的一些信息,我么可以通过这个类拿到这些信息                         如何得到这个UserInfo类呢?  */                         QQToken qqToken = mTencent.getQQToken();                         UserInfo info = new UserInfo(getApplicationContext(), qqToken);                         //这样我们就拿到这个类了,之后的操作就跟上面的一样了,同样是解析JSON                   
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80                         info.getUserInfo(new IUiListener() {                                   public void onComplete(final Object response) {                                         // TODO Auto-generated method stub                                         Log.e(TAG, "---------------111111");                                         Message msg = new Message();                                         msg.obj = response;                                         msg.what = 0;                                         mHandler.sendMessage(msg);                                         Log.e(TAG, "-----111---"+response.toString());                                         /**由于图片需要下载所以这里使用了线程,如果是想获得其他文字信息直接                                           * 在mHandler里进行操作                                           *                                           */                                         new Thread(){                                                   @Override                                                 public void run() {                                                         // TODO Auto-generated method stub                                                         JSONObject json = (JSONObject)response;                                                         try {                                                                 bitmap = Util.getbitmap(json.getString("figureurl_qq_2"));                                                         } catch (JSONException e) {                                                                 // TODO Auto-generated catch block                                                                 e.printStackTrace();                                                         }                                                         Message msg = new Message();                                                         msg.obj = bitmap;                                                         msg.what = 1;                                                         mHandler.sendMessage(msg);                                                 }                                                                                    }.start();                                 }                                                            public void onCancel() {                                         Log.e(TAG, "--------------111112");                                         // TODO Auto-generated method stub                                                                  }                                 public void onError(UiError arg0) {                                         // TODO Auto-generated method stub                                         Log.e(TAG, "-111113"+":"+arg0);                                 }                                                           });                                           }                   public void onError(UiError arg0) {                         // TODO Auto-generated method stub                                           }                                              }         Handler mHandler = new Handler() {                   @Override                 public void handleMessage(Message msg) {                         if (msg.what == 0) {                                 JSONObject response = (JSONObject) msg.obj;                                 if (response.has("nickname")) {                                         try {                                                 nicknameString=response.getString("nickname");                                                                                                   nicknameTextView.setText(nicknameString);                                                 Log.e(TAG, "--"+nicknameString);                                         } catch (JSONException e) {                                                 // TODO Auto-generated catch block                                                 e.printStackTrace();                                         }                                 }                         }else if(msg.what == 1){                                 Bitmap bitmap = (Bitmap)msg.obj;                                 userlogo.setImageBitmap(bitmap);                                                           }                 }           };             }
Android 实现QQ第三方登录

文章图片

上图是登录Q的返回LOG
Android 实现QQ第三方登录

文章图片

上图是我们获得腾讯提供的UserInfo返回的LOG
然后是AppConstant.java
?
1 2 3 public class AppConstant {         public static String APP_ID="222222"; }
然后是Util.java
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 public class Util {         public static String TAG="UTIL";         public static Bitmap getbitmap(String imageUri) {                 Log.v(TAG, "getbitmap:" + imageUri);                 // 显示网络上的图片                 Bitmap bitmap = null;                 try {                         URL myFileUrl = new URL(imageUri);                         HttpURLConnection conn = (HttpURLConnection) myFileUrl                                         .openConnection();                         conn.setDoInput(true);                         conn.connect();                         InputStream is = conn.getInputStream();                         bitmap = BitmapFactory.decodeStream(is);                         is.close();                           Log.v(TAG, "image download finished." + imageUri);                 } catch (IOException e) {                         e.printStackTrace();                         Log.v(TAG, "getbitmap bmp fail---");                         return null;                 }                 return bitmap;         } }
 
至此全部代码就在这里了,我们获得了OpenID这个唯一标识最关键的东西,然后看项目中需要登录的接口还需要什么信息,获取到就能实现登陆了。

    推荐阅读