转载--http://www.eoeandroid.com/thread-325071-1-1.html

最近公司由于项目要求,在应用中集成了QQ和新浪微博登录的功能,以前并没有接触过这方面的东西,前2天研究清楚,并实现了,写点心得和大家分享,同时也作为学习记录保留下来。    废话不说,直入正题了。

一。使用QQ账号登录第三方应用

这里的第三方应用指的当然是我们自己开发的应用。

腾讯开发平台是一个比较大的开放平台,它包括了腾讯微博开发平台,微信平台等诸多平台,而我们所需要用到的东西,都在QQ互联开放平台。之所以在一开始就说明这一点是因为,撸主之前因为没搞清楚他们之间的关系,走了不少弯路,所以希望大家能够注意到。

1. 在开发之前,首先要使用QQ号登录平台,然后完善开发者信息成为开发者,之后,要在管理中心,创建你的应用,其中包括完善很多关于你的应用的信息。(关于这部分的详细信息,请查看官方在线文档开发者注册和android应用注册)。

2.当我们成功创建 了应用之后,会获得APP ID,这个ID在开发中是必须的。

3.QQ互联SDK,前往该网页,可以下载官方的sdk资料,其中 包括了jar文件,demo,以及详细的开发说明文档。

4.(警醒)开发的第一步,首先要把所需要的jar文件导入到我们的工程中去,在上一步下载的SDK文档中,我们会发现有一个open_sdk.jar文件,按照说明文档导入进去,但是我们会发现在说明文档中分明提到了2个jar文件,腾讯开发平台SDK在这个链接中下载到相应的文件之后,我们会发现它和之前下载的QQ互联文件几乎一样,区别在于开发说明文档在细节上的区别,以及JAR文件的不同。我们刚才提到的所缺少的一个jar文件,在这就可以找到了。但是需要特别注意的是,有些人一看,好像2个jar文件都在这里,那就直接把这2个导入进去开发吧!恭喜你成功掉入陷阱了!我们仔细对比会发现,在腾讯SDK和QQ互联sdk中的open_sdk.jar,他们的大小是不一样的,这2个文件是有区别的。撸主也是在这里纠结了很久,代码完成后没有提示错误,但是运行老是崩掉,后来发现这个问题之后,一阵无语。
    简言之,将QQ互联sdk中的open_sdk.jar以及腾讯sdk中的mta_sdk_XXX.jar导入到工程之后,可以按照开发文档,继续往下进行。
    
    5.关于AndroidManifest的配置,开发文档比较详尽,不赘述。

6.鉴于官方demo的复杂性,以及文档中的不完整和不一致性,我提供一个自己简单封装的类,参考一下:
[mw_shl_code=java,true]/**
* 用于使用QQ互联授权,登录的辅助类

* @author totoro
* @since 2014-02-28
*/
public class TencentQQHelper {
        public static final String APP_ID = "101025815";
        public static final String SCOPE = "get_simple_userinfo";
        public Tencent tencent;
        public Context context;
        public UserInfo userInfo;
        
        public TencentQQHelper(Context context) {
                this.context = context;
                tencent = Tencent.createInstance(APP_ID, context.getApplicationContext());
        }
        
        /**
         * 登录
         * @since 2014-02-28
         */
        public void login() {
                if (!tencent.isSessionValid()) {
                        tencent.login((Activity) context, SCOPE, new BaseUIListener() {

@Override
                                protected void doComplete(JSONObject obj) {
                                        TencentQQToken token = new TencentQQToken();                                        
                                        try {
                                                token.setOpenid(obj.getString("openid"));
                                                token.setAccess_token(obj.getString("access_token"));
                                                token.setExpires_in(obj.getString("expires_in"));
                                        } catch (JSONException e) {
                                                e.printStackTrace();
                                        }                                        
                                        
                                        QQTokenKeeper.writeAccessToken(context, token);
                                        userInfo = new UserInfo(context, tencent.getQQToken());                                
                                        getUserInfo();
                                }
                        });
                } else {
                        tencent.logout(context);
                }
        }
        
        /**
         * 获取用户信息
         * @since 2014-02-28
         */
        public void getUserInfo() {
                userInfo.getUserInfo(new BaseUIListener() {

@Override
                        protected void doComplete(JSONObject obj) {
                                Intent intent = new Intent(context,UserInfoActivity.class);
                Bundle extras = new Bundle();
                try {
                                        extras.putString("name", obj.getString("nickname"));
                                } catch (JSONException e) {
                                        e.printStackTrace();
                                }    
                intent.putExtras(extras);
                context.startActivity(intent);
                        }                
                });                
        }
        
        /**
         * 用户授权和获取用户信息的回调
         * 
         * @author totoro
         */
        public class BaseUIListener implements IUiListener {
        
                @Override
                public void onComplete(Object response) {
                        doComplete((JSONObject) response);        
                }
                
                protected void doComplete(JSONObject obj) {
        
                }

@Override
                public void onError(UiError e) {
                         Toast.makeText(context,e.errorMessage, Toast.LENGTH_SHORT).show();
                }

@Override
                public void onCancel() {
                         Toast.makeText(context,"取消操作", Toast.LENGTH_SHORT).show();
                }
        }
}[/mw_shl_code]
    关于其他相关的功能,比如注销什么的,应该相对简单,可以在demo里面找到,我就不说了。

发帖BUG不少啊,一编辑我的链接全都不见了,感觉不会爱了!

我就不贴了,腾讯开发平台,QQ互联开发平台,所有相关东西都在里面,大家自己去找吧。

我也就不上传相关文件了,毕竟下载好贵的,如果实在需要的,可以找我。
   再贴下上面代码涉及到的类:
[mw_shl_code=java,true]/**
* 存放登录令牌的类
* @author totoro
*
*/
public class TencentQQToken {
        private String openid;
        private String access_token;
        private String expires_in;
        
        public TencentQQToken() {}
        
        public String getOpenid() {
                return openid;
        }
        public void setOpenid(String openid) {
                this.openid = openid;
        }
        public String getAccess_token() {
                return access_token;
        }
        public void setAccess_token(String access_token) {
                this.access_token = access_token;
        }
        public String getExpires_in() {
                return expires_in;
        }
        public void setExpires_in(String expires_in) {
                this.expires_in = expires_in;
        }
}
[/mw_shl_code]

[mw_shl_code=java,true]/**
* 该类定义了QQ互联授权时所需要的参数

* @author totoro
* @since 2014-02-28
*/
public class QQTokenKeeper {
        private static final String PREFERENCES_NAME = "tencent_qq_token";

private static final String KEY_OPENID           = "openid";
    private static final String KEY_ACCESS_TOKEN  = "access_token";
    private static final String KEY_EXPIRES_IN    = "expires_in";

/**
     * 保存 Token 对象到 SharedPreferences。
     * 
     * @param context 应用程序上下文环境
     * @param token   Token 对象
     */
    public static void writeAccessToken(Context context, TencentQQToken token) {
        if (null == context || null == token) {
            return;
        }
        
        SharedPreferences pref = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_APPEND);
        Editor editor = pref.edit();
        editor.putString(KEY_OPENID, token.getOpenid());
        editor.putString(KEY_ACCESS_TOKEN, token.getAccess_token());
        String expires_in = token.getExpires_in();
        editor.putLong(KEY_EXPIRES_IN, System.currentTimeMillis() + Long.parseLong(expires_in) * 1000);
        editor.commit();
    }

/**
     * 从 SharedPreferences 读取 TencentQQToken 信息。
     * 
     * @param context 应用程序上下文环境
     * 
     * @return 返回 TencentQQToken 对象
     */
    public static TencentQQToken readAccessToken(Context context) {
        if (null == context) {
            return null;
        }
        
        TencentQQToken token = new TencentQQToken();
        SharedPreferences pref = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_APPEND);
        token.setOpenid(pref.getString(KEY_OPENID, ""));
        token.setAccess_token(pref.getString(KEY_ACCESS_TOKEN, ""));
        long expires_in = (pref.getLong(KEY_EXPIRES_IN, -1) - System.currentTimeMillis())/1000; 
        token.setExpires_in(Long.toString(expires_in));
        return token;
    }

/**
     * 清空 SharedPreferences 中 Token信息。
     * 
     * @param context 应用程序上下文环境
     */
    public static void clear(Context context) {
        if (null == context) {
            return;
        }
        
        SharedPreferences pref = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_APPEND);
        Editor editor = pref.edit();
        editor.clear();
        editor.commit();
    }

}
[/mw_shl_code]
    二。使用新浪微博账号登录第三方应用

相比来说,新浪微博毕竟省事一些。

我们同样需要注册,创建应用,获得APP_KEY(和QQ的APP_ID类似)。通过开发我们可以发现,他和QQ互联的开发模式非常相似。

1. http://open.weibo.com/wiki/SDK#Android_SDK 我们在这里下载到所需要的文件后,可以找到一份比较详细的开发文档。同时有demo可供参考,不过有不同的是,这里我们不通过导入jar文件的方式来引用,而是要将一个作为library的工程WeiboSDk,导入到eclipse,然后add到自己的工程,具体见文档。

2.在登录入口方面,QQ互联是提供了所有接口,我们自己完成从按钮到接口的实现;而新浪微博则是为我们提供了封装好的登录按钮,我们需要在布局文件中添加新浪的登录按钮来实现登录,登录按钮分为数种,具体使用可见文档。显然这个比QQ省事的多。

3.貌似没什么可说的,贴上自己的实现供参考:
[mw_shl_code=java,true]/**
* 使用新浪微博账号登录时的SSO辅助类

* 2014-02-27
* @author totoro
*
*/
public class SinaWeiboSSOHelper {
        /**
         * 用于使用新浪微博账号登录的APP KEY
         */
        public static final String APP_KEY = "809484557";
        /**
         * 使用新浪微博账号登录时的授权默认回调页
         */
        public static final String REDIRECT_URL = "https://api.weibo.com/oauth2/default.html";
        /**
         * 用于新浪微博登录的授权参数
         */
        public static final String SCOPE = "email";
        
        public AuthInfo authInfo;
        public Context context;
        public AuthListener authListener;
        
        public SinaWeiboSSOHelper(Context context) {
                this.context = context;
                // 创建授权认证信息
                authInfo = new AuthInfo(context, APP_KEY, REDIRECT_URL, SCOPE);
                authListener = new AuthListener();
        }
        
        /**
     * 登入按钮的监听器,接收授权结果。
     */
    @SuppressLint("SimpleDateFormat")
        private class AuthListener implements WeiboAuthListener {
        @Override
        public void onComplete(Bundle values) {
                Oauth2AccessToken accessToken = Oauth2AccessToken.parseAccessToken(values);
            if (accessToken != null && accessToken.isSessionValid()) {
     
                SinaAccessTokenKeeper.writeAccessToken(context, accessToken);
                UsersAPI usersAPI = new UsersAPI(accessToken);
                usersAPI.show(Long.parseLong(accessToken.getUid()), new UserRequstListener());
            }
        }

@Override
        public void onWeiboException(WeiboException e) {
            Toast.makeText(context, e.getMessage(), Toast.LENGTH_SHORT).show();
        }

@Override
        public void onCancel() {
            Toast.makeText(context,"取消授权", Toast.LENGTH_SHORT).show();
        }
    }
    
    /**
     * 使用UsersAPI获取用户信息时需要的请求接口
     * 
     * 2014-02-26
     * @author totoro
     *
     */
    private class UserRequstListener implements RequestListener {

@Override
                public void onComplete(String response) {
                        if (!TextUtils.isEmpty(response)) {
                try {
                    JSONObject obj = new JSONObject(response);
                    /**
                     * 将获取到的用户信息发送到即将跳转到的个人界面
                     */
                    Intent intent = new Intent(context,UserInfoActivity.class);
                    Bundle extras = new Bundle();
                    extras.putString("name", obj.getString("screen_name"));
                    extras.putString("location", obj.getString("location"));
                    intent.putExtras(extras);
                    context.startActivity(intent);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }        
                }

@Override
                public void onComplete4binary(ByteArrayOutputStream responseOS) {
                        // TODO Auto-generated method stub        
                }

@Override
                public void onIOException(IOException e) {
                        Log.v("IOException",e.getMessage());        
                }

@Override
                public void onError(WeiboException e) {
                        Log.v("Error",e.getMessage());        
                }        
    }
}
[/mw_shl_code]

[mw_shl_code=java,true]/**
* 该类定义了微博授权时所需要的参数。

* @author SINA
* @since 2013-10-07
*/
public class SinaAccessTokenKeeper {
    private static final String PREFERENCES_NAME = "sina_weibo_token";

private static final String KEY_UID           = "uid";
    private static final String KEY_ACCESS_TOKEN  = "access_token";
    private static final String KEY_EXPIRES_IN    = "expires_in";
    
    /**
     * 保存 Token 对象到 SharedPreferences。
     * 
     * @param context 应用程序上下文环境
     * @param token   Token 对象
     */
    public static void writeAccessToken(Context context, Oauth2AccessToken token) {
        if (null == context || null == token) {
            return;
        }
        
        SharedPreferences pref = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_APPEND);
        Editor editor = pref.edit();
        editor.putString(KEY_UID, token.getUid());
        editor.putString(KEY_ACCESS_TOKEN, token.getToken());
        editor.putLong(KEY_EXPIRES_IN, token.getExpiresTime());
        editor.commit();
    }

/**
     * 从 SharedPreferences 读取 Token 信息。
     * 
     * @param context 应用程序上下文环境
     * 
     * @return 返回 Token 对象
     */
    public static Oauth2AccessToken readAccessToken(Context context) {
        if (null == context) {
            return null;
        }
        
        Oauth2AccessToken token = new Oauth2AccessToken();
        SharedPreferences pref = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_APPEND);
        token.setUid(pref.getString(KEY_UID, ""));
        token.setToken(pref.getString(KEY_ACCESS_TOKEN, ""));
        token.setExpiresTime(pref.getLong(KEY_EXPIRES_IN, 0));
        return token;
    }

/**
     * 清空 SharedPreferences 中 Token信息。
     * 
     * @param context 应用程序上下文环境
     */
    public static void clear(Context context) {
        if (null == context) {
            return;
        }
        
        SharedPreferences pref = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_APPEND);
        Editor editor = pref.edit();
        editor.clear();
        editor.commit();
    }
}
[/mw_shl_code]
需要注意的是,以上APP_ID和APP_KEY都需要替换成自己的。

如有疑问或者建议,可以随时留言。

三。关于其他实现方式

其实我们可以使用其他第三方sdk来实现这些功能,比如ShareSDK,他提供了包括QQ,新浪微博,人人网,开心网等等一系列第三方分享和登录等功能,而且有一个明显的好处是,不用分别去学习各自平台的开发方式,而是只需要学习ShareSDK的开发方式之后,就可以实现很多平台的分享,尤其是当我们的应用中需要集成比较多的第三方平台。

但是当我们的应用比较少的集成第三方,或者比较少的集成第三方的功能,使用这种方式无疑会增加包的大小,因为我们同时集成了其他很多用不到的功能。这时候如果能选择本文介绍的方式开发的话,可以减少应用的大小。

大概就这样了,三克油。

转载于:https://www.cnblogs.com/harvesteveryday/p/4236518.html

[Android分享] 使用QQ账号,新浪微博账号登录第三方应用相关推荐

  1. 分享到qq空间android,android 分享到QQ空间的全部操作

    android 分享到QQ空间的所有操作 http://wiki.open.qq.com/wiki/mobile/SDK下载 android:name="com.tencent.connec ...

  2. 调用QQ/微信/新浪微博 实现登录

    调用QQ/微信/新浪微博的第三方登录接口(开发者端口) 官方文档写的很明确了,不过在这里总结一下,方便小白了解下具体接入流程和情况 总体大致流程: 其中: 1.微信登录可省去获取用户标识ID这一步,获 ...

  3. Android 分享到qq和qq空间中的网页

    将应用的网页,图片,问题分享到qq好友和请求空间中,是很常见的开发需求,首先是分享到qq中 一.到腾讯公共平台注册相关应用的信息,拿到应用的app_id等相关信息 二.下载官网中的相关的demo,导入 ...

  4. 分享到QQ、新浪微博、微信代码

    闲话少说直接上代码: <script type="text/javascript">function qq(title,url,pic){var p = {url: ' ...

  5. android 你访问的站点在新浪微博认证失败,Android Oauth 认证多个新浪微博账号时,报 api.t.sina.com.cn:80!!...

    错误日志如上: 01-07 03:05:16.096: WARN/System.err(31479): Caused by: java.net.UnknownHostException: Host i ...

  6. Android Studio实现QQ的注册、登录和好友列表页面的跳转

    项目目录 一.项目概述 二.开发环境 三.详细设计 1.登录界面的搭建 2.注册界面的搭建 3.好友列表界面的搭建 4.跳转功能实现 四.项目效果 五.项目总结 六.源码下载 一.项目概述 本次项目主 ...

  7. android 分享到QQ空间的所有操作

    http://wiki.open.qq.com/wiki/mobile/SDK 下载   <!-- QZone分享必须加上下面两个activity -->       <activi ...

  8. 腾讯qq和新浪微博网站登录接口及文档

    腾讯QQ接入网站: http://wiki.connect.qq.com/js_sdk使用说明 新浪微博接入网站: http://open.weibo.com/wiki/index.php/Weibo ...

  9. android 分享到qq黑屏,为什么我的手机打开QQ好友动态就会黑屏?

    满意答案 经常出现黑屏死机现象的原因及解决方法 这种黑屏死机的现象尤其在以下两种情况发生比较频繁: 1.发生在多个程序运行时(比如闹铃.短信.电话.拍照.游戏等等程序). 2.运行程序时按键太快使手机 ...

最新文章

  1. 基于 PacBio 测序数据的纠错算法评测与剪切位点识别研究
  2. setDrawingCacheEnabled(boolean flag)
  3. 中provide的用法_英语词法:中考动词用法系统梳理下
  4. 占内存小的qq_手机内存空间告急,这些办法就能轻松搞定!
  5. 东莞市经济贸易学校计算机,2017东莞市经济贸易学校中考录取分数线公布
  6. ( 一 ) Jpbm环境的搭建
  7. Codeforces Round #660 (Div. 2)
  8. [20170508]listagg拼接显示字段.txt
  9. 【快速入门Linux】2_Linux命令—基本使用
  10. python3 全局变量 局部变量_Python3获取变量名并修改函数内部的外部变量和局部变量,python3,在,local...
  11. 2017年3月21日
  12. hadoop之 hadoop日志存放路径
  13. 用户体验设计师、UI 设计师和交互设计师之间的区别,如何挑选图书?
  14. 几招让你轻松解决 Uni-app、原生 App 混合开发问题
  15. 哈希值是什么? 哈希概念
  16. 2022-05微软漏洞通告
  17. php google gmail第三方登录
  18. 不要虚掷你的黄金时代,不要去倾听枯燥乏味的东西,不要设法挽留无望的失败,不要把你的生命献给无知、平庸和低俗。
  19. 纹身时应该注意的一些事项
  20. 天平游码读数例题_使用天平游码时的读数方法

热门文章

  1. \t\tlinux学习之安装ttylinux(世界最小的linux操作系统)(转载)
  2. 通信协议相关组织的介绍
  3. Mac卸载 npm 和 n
  4. 一个对随机过程的理解
  5. 用opencv-python和matplotlib实现视频的颜色直方图的动态显示
  6. 大学计算机课笔记,浙江大学计算机专业课辅导班笔记
  7. discuz二次开发常用技术手册代码
  8. 技术福利丨深度解读抖音同款 RTC 产品背后的关键技术
  9. 产品经理,Facebook是如何面试产品实习生的
  10. 对口高考计算机应用真题,对口高考计算机应用基础总复习试题1