zoukankan      html  css  js  c++  java
  • Android开发实现QQ三方登录 标签: android开发qq三方登录

    本文分为两个部分:一是QQ的授权部分;二是获取用户的基本信息部分

    一、授权部分

    1.首先,先去腾讯开放平台获取APP ID和APP KEY(未注册腾讯开发者账号的可能需要先注册账号),获取的过程还是还是非常容易的(不用填写任何的应用程序信息)。

    http://open.qq.com/


    2.下载SDK(http://wiki.open.qq.com/wiki/mobile/SDK%E4%B8%8B%E8%BD%BD

    3.下载好SDK后,将其中的两个jar包(mta-sdk-1.6.2.jar、open_sdk_r5276.jar)引入到工程当中。

    4.在AndroidManifest.xml的application标签中添加一下两个activity。

    <activity  
       android:name="com.tencent.tauth.AuthActivity"  
       android:noHistory="true"  
       android:launchMode="singleTask" >  
        <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="tencent*********" />  
        </intent-filter>  
    </activity>  
      
    <activity android:name="com.tencent.connect.common.AssistActivity"  
          android:theme="@android:style/Theme.Translucent.NoTitleBar"  
          android:configChanges="orientation|keyboardHidden|screenSize"   
    />  

    注意:上面<data android:scheme="tencent*********" />中的*****要替换成自己一开始获取到的APP ID(假设APP ID是123456,则替换后为:scheme="tencent123456")。

    5.添加访问网络的权限。

    <uses-permission android:name="android.permission.INTERNET" />  
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />  

    6.Java实现:接下来需要两个对象(布局文件和控件的初始化自行另外解决)

             //需要腾讯提供的一个Tencent类  
             private Tencent mTencent;  
            //还需要一个IUiListener 的实现类(LogInListener implements IUiListener)  
             private LogInListener mListener;  
      
            //首先需要用APP ID 获取到一个Tencent实例  
            mTencent = Tencent.createInstance(QQ_APP_ID, this.getApplicationContext());  
            //初始化一个IUiListener对象,在IUiListener接口的回调方法中获取到有关授权的某些信息  
            // (千万别忘了覆写onActivityResult方法,否则接收不到回调)  
            mListener = new LogInListener();  

    其中,LogInListener是IUiListener的实现类,其中的回调方法用来接收授权后的相关信息:

    private class LogInListener implements IUiListener {  
      
            @Override  
            public void onComplete(Object o) {  
                Toast.makeText(MainActivity.this, "授权成功!", Toast.LENGTH_LONG).show();  
                System.out.println("o.toString() ------------------------->        " + o.toString());  
            }  
      
            @Override  
            public void onError(UiError uiError) {  
      
                Toast.makeText(MainActivity.this, "授权出错!", Toast.LENGTH_LONG).show();  
            }  
      
            @Override  
            public void onCancel() {  
                Toast.makeText(MainActivity.this, "授权取消!", Toast.LENGTH_LONG).show();  
            }  
        }  

    注意:别忘了覆写onActivityResult方法,否则接收不到回调

        //确保能接收到回调  
        @Override  
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
            super.onActivityResult(requestCode, resultCode, data);  
      
            Tencent.onActivityResultData(requestCode, resultCode, data, mListener);  
        }  

    7.登录与登出

                      //调用QQ登录,用IUiListener对象作参数(点击登录按钮时执行以下语句)  
                        if (!mTencent.isSessionValid()) {  
                            mTencent.login(MainActivity.this, "all", mListener);  
                        }  
      
                       //登出比较简单  
                        mTencent.logout(MainActivity.this);  

    如此整个授权的流程就ok了,我们可以在onComplete回调方法中获取到授权的信息。

    顺便提一下,上面IUiListener的onComplete回调方法参数Object对象的格式为:

    {  
        "ret": 0,  
        "openid": "19E8D43EB75ED256CAC70C02953F188A",  
        "access_token": "65A5A933F116085E051F39CAD65084EF",  
        "pay_token": "BA387A1679483A4C8585BE268C7C4128",  
        "expires_in": 7776000,  
        "pf": "desktop_m_qq-10000144-android-2002-",  
        "pfkey": "2c7171fb052154f89e9d439e17e18c11",  
        "msg": "",  
        "login_cost": 442,  
        "query_authority_cost": 322,  
        "authority_cost": 0  
    }  

    二、获取用户的基本信息部分。(有用到上一部分onComplete回调方法中传回来的Object对象)

    上面只是实现了授权,并未拿到用户的基本信息,下面是这部分的实现

    8.在第6步中的onComplete回调方法中添加以下语句

           @Override  
            public void onComplete(Object o) {  
                Toast.makeText(MainActivity.this, "授权成功!", Toast.LENGTH_LONG).show();  
                System.out.println("o.toString() ------------------------->        " + o.toString());  
      
      
                JSONObject jsonObject = (JSONObject) o;  
      
                //设置openid和token,否则获取不到下面的信息  
                initOpenidAndToken(jsonObject);  
                //获取QQ用户的各信息  
                getUserInfo();  
            }  

    其中,initOpenidAndToken 与 getUserInfo的实现如下

    private void initOpenidAndToken(JSONObject jsonObject) {  
            try {  
                String openid = jsonObject.getString("openid");  
                String token = jsonObject.getString("access_token");  
                String expires = jsonObject.getString("expires_in");  
      
                mTencent.setAccessToken(token, expires);  
                mTencent.setOpenId(openid);  
      
            } catch (JSONException e) {  
                e.printStackTrace();  
            }  
        }  
      
        private void getUserInfo() {  
      
            //sdk给我们提供了一个类UserInfo,这个类中封装了QQ用户的一些信息,我么可以通过这个类拿到这些信息  
            QQToken mQQToken = mTencent.getQQToken();  
            UserInfo userInfo = new UserInfo(MainActivity.this, mQQToken);  
            userInfo.getUserInfo(new IUiListener() {  
                                     @Override  
                                     public void onComplete(final Object o) {  
                                         JSONObject userInfoJson = (JSONObject) o;  
                                         Message msgNick = new Message();  
                                         msgNick.what = 0;//昵称  
                                         try {  
                                             msgNick.obj = userInfoJson.getString("nickname");//直接传递一个昵称的内容过去  
                                         } catch (JSONException e) {  
                                             e.printStackTrace();  
                                         }  
                                         mHandler.sendMessage(msgNick);  
                                         //子线程 获取并传递头像图片,由Handler更新  
                                         new Thread(new Runnable() {  
                                             @Override  
                                             public void run() {  
                                                 Bitmap bitmapHead = null;  
                                                 if (((JSONObject) o).has("figureurl")) {  
                                                     try {  
                                                         String headUrl = ((JSONObject) o).getString("figureurl_qq_2");  
                                                         bitmapHead = Util.getbitmap(headUrl);  
                                                     } catch (JSONException e) {  
                                                         e.printStackTrace();  
                                                     }  
                                                     Message msgHead = new Message();  
                                                     msgHead.what = 1;  
                                                     msgHead.obj = bitmapHead;  
                                                     mHandler.sendMessage(msgHead);  
                                                 }  
                                             }  
                                         }).start();  
      
                                     }  
      
                                     @Override  
                                     public void onError(UiError uiError) {  
                                         Log.e("GET_QQ_INFO_ERROR", "获取qq用户信息错误");  
                                         Toast.makeText(MainActivity.this, "获取qq用户信息错误", Toast.LENGTH_SHORT).show();  
                                     }  
      
                                     @Override  
                                     public void onCancel() {  
                                         Log.e("GET_QQ_INFO_CANCEL", "获取qq用户信息取消");  
                                         Toast.makeText(MainActivity.this, "获取qq用户信息取消", Toast.LENGTH_SHORT).show();  
                                     }  
                                 }  
            );  
        }  

    其中,自定义的Util类如下

    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;  
        }  
    }  

    顺便提一下,虽然这里也是一个IUiListener的回调,但是onComplete的参数o的json数据内容与获取权限时的那个不一样,如下:

    {  
        "ret": 0,  
        "msg": "",  
        "is_lost": 0,  
        "nickname": "",  
        "gender": "",  
        "province": "",  
        "city": "",  
        "figureurl": "",  
        "figureurl_1": "",  
        "figureurl_2": "",  
        "figureurl_qq_1": "",  
        "figureurl_qq_2": "",  
        "is_yellow_vip": "0",  
        "vip": "0",  
        "yellow_vip_level": "0",  
        "level": "0",  
        "is_yellow_year_vip": "0"  
    }  

    也可参照官方文档: http://wiki.open.qq.com/wiki/v3/user/get_info

    9.Handler部分(这里我只拿了头像和昵称,若要获得其他信息,对照上面这个json数据取相应的值就可以了)

         //显示获取到的头像和昵称  
        private Handler mHandler = new Handler() {  
            @Override  
            public void handleMessage(Message msg) {  
                super.handleMessage(msg);  
                if (msg.what == 0) {//获取昵称  
                    tvNickName.setText((CharSequence) msg.obj);  
                } else if (msg.what == 1) {//获取头像  
                    headerLogo.setImageBitmap((Bitmap) msg.obj);  
                }  
            }  
        };  

    Demo下载地址:http://download.csdn.net/detail/highboys/9597386

  • 相关阅读:
    drf之频率器拓展
    drf之分页器
    drf之异常处理
    drf之过滤与排序
    drf之频率
    drf之权限
    drf之认证
    drf之路由
    drf之视图家族
    性能优化
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/7461067.html
Copyright © 2011-2022 走看看