Android中集成QQ登陆和QQ好友分享及QQ空间分享

extends : http://blog.csdn.net/arjinmc/article/details/38439957

相关官方文档及下载地址:

如果只用分享和登陆,用lite包就可以,体积小

http://wiki.open.qq.com/wiki/mobile/API%E8%B0%83%E7%94%A8%E8%AF%B4%E6%98%8E#1.13_.E5.88.86.E4.BA.AB.E6.B6.88.E6.81.AF.E5.88.B0QQ.EF.BC.88.E6.97.A0.E9.9C.80QQ.E7.99.BB.E5.BD.95.EF.BC.89http://wiki.open.qq.com/wiki/mobile/SDK%E4%B8%8B%E8%BD%BD

本文基于QQ open sdk V2.4.1。

QQ登录应用有一个地方是需要注意的, QQ申请同一品牌应用(包括网站和app),需要相互依赖申请,因为在QQ互联中,一个应用对应一个app key,如果网站和app的app key是不同的,这样相同用户使用QQ登录时候所产生的openid就会不同了,此时无法判断是否为同一个用户。在QQ互联中,一个用户的openid是对应一个应用,也就是说,如果这个用户去登录别的应用,QQ互联返回的openid是不同的。

准备工作:

1.注册腾讯开发者账号,上http://open.qq.com注册,填写好详细信息认证开发者信息,大概等1个工作日就可以审核完毕。

2.审核通过后可以在“管理资料”中创建应用,在这里我们选择的是移动应用。

3.下载open qq给的sdk包(http://wiki.open.qq.com/wiki/mobile/SDK%E4%B8%8B%E8%BD%BD),解压看到,doc是需集成移动数据分析才会使用到,也是一个教程,在这里不介绍了。jar就是open qq提供的jar包,但这里我们只需要用到mta-sdk-1.6.2.jar.我们把这个包复制到我们项目中的libs中,然后配置要引用路径java path。

4.在Manifest中申明权限:

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

5.在Manifest中添加这些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" />
                            <!--下面这个XXXXXXXXXXXX就是你申请腾讯开发平台所给的app key-->
                      <data android:scheme="tencentXXXXXXXXXXXX" />
         </intent-filter>
 </activity>
 <activity android:name="com.tencent.connect.common.AssistActivity"
    android:theme="@android:style/Theme.Translucent.NoTitleBar"
    android:configChanges="orientation|keyboardHidden"/>

QQ登录

1. 我们需要一个全局变量public static Tencent mTencent,当然你也可以声明为私有的非静态类型,这个是open qq给的例子中是这么写,为什么要这么用,后面会解释。

2.使用QQ登录:

 

private void loginByQQ(){
           // Constant.QQ_KEY 这里是申请open qq给的app key
           mTencent =Tencent.createInstance(Constant.QQ_KEY, LoginActivity.this);
           if (!mTencent.isSessionValid()) {
                    IUiListener listener = newBaseUiListener() {
                             @Override
                             protected voiddoComplete(JSONObject values) {
                                       //Log.e("qq",values.toString());
                                       try {
                                      //在这里我们可以去到唯一QQ互联可以给我们识别不同QQ用户的openid
                                                qqOpenId= values.getString("openid");
                                       } catch(JSONException e) {
                                                //TODO Auto-generated catch block
                                                e.printStackTrace();
                                       }finally{
                                                if(qqOpenId==null){
                                                         qqOpenId= "";
                                                }
                                       }
                                       ToastUtil.showToast(LoginActivity.this,"login success");
                                       updateUserInfo();
                                 //Log.e("SDKQQAgentPref","AuthorSwitch_SDK:" + SystemClock.elapsedRealtime());
                             }
                    };
                   mTencent.login(this,"all", listener);
                    //Log.e("SDKQQAgentPref","FirstLaunch_SDK:" + SystemClock.elapsedRealtime());
           } else {
              mTencent.logout(this);
           }
}
 

3. 获取QQ登录用户信息

 

privatevoid updateUserInfo() {
           if (mTencent != null &&mTencent.isSessionValid()) {
                    IUiListener listener = newIUiListener() {  

                             @Override
                             public voidonError(UiError e) {
                                       //获取不到这个信息
                             }  

                             @Override
                             public voidonComplete(final Object response) {
                                       JSONObjectjson = (JSONObject)response;
                                       //Log.e("qquser info", json.toString());可以在这里打印来看看获取到了用户的什么信息,如果你想获取QQ号,那是不可能的                                       //因为open qq没有提供这样的接口。
                                       StringnickName = getString(R.string.qq_user);//比如QQ昵称
                                       try {
                                                nickName= json.getString("nickname");
                                      } catch (JSONException e) {
                                                e.printStackTrace();
                                       }
                             }  

                             @Override
                             public voidonCancel() {
                                       //获取用户信息被取消
                             }
                    };
                    UserInfo mInfo = newUserInfo(this, mTencent.getQQToken());
                    mInfo.getUserInfo(listener);  

           } else {
           }
}
 

4. 最重还需要一个回调类

 

private classBaseUiListener implements IUiListener {
           @Override
           public void onComplete(Objectresponse) {
               //V2.0版本,参数类型由JSONObject 改成了Object,具体类型参考api文档
                    doComplete((JSONObject)response);
           }
           protected void doComplete(JSONObjectvalues) {
                    //在这里可以做一些登录成功的处理
                    ToastUtil.showToast(LoginActivity.this,getString(R.string.login_success));
           }
           @Override
           public void onError(UiError e) {
                    //在这里可以做登录失败的处理
                    ToastUtil.showToast(LoginActivity.this,getString(R.string.qq_login_fail));
           }
           @Override
           public void onCancel() {
                    //在这里可以做登录被取消的处理
                    ToastUtil.showToast(LoginActivity.this,getString(R.string.qq_login_cancel));
           }  

}  

分享到QQ空间

方式一:

在登录的时候,前面我们有用到public static Tencent mTencent,这个变量声明为静态变量,因为在demo例子中,这个mTencent对象在最底的Activty,所以它一直都没有被关闭,一直有效。因此,在这种情况下,我们可以直接用下面这个方法来做QQ分享。

1.分享方法:

privatevoid shareToQQzone(){
       mQzoneShare = new QzoneShare(this,LoginActivity.mTencent.getQQToken());
       final Bundle params = new Bundle();
       //设置分享类型:图文并茂加链接。其他类型见帮助文档
       int shareType = QzoneShare.SHARE_TO_QZONE_TYPE_IMAGE_TEXT;
       params.putInt(QzoneShare.SHARE_TO_QZONE_KEY_TYPE, shareType);
       //标题
       params.putString(QzoneShare.SHARE_TO_QQ_TITLE, "测试");
       //内容
       params.putString(QzoneShare.SHARE_TO_QQ_SUMMARY, "contenttext");
       if (shareType !=QzoneShare.SHARE_TO_QZONE_TYPE_APP) {
            //app分享不支持传目标链接
           params.putString(QzoneShare.SHARE_TO_QQ_TARGET_URL,"http://www.hicsg.com");
        }
//        // 支持传多个imageUrl,在这里我测试只放一张图片,最多可以放9张
        ArrayList<String> imageUrls = newArrayList<String>();
       imageUrls.add("http://media-cdn.tripadvisor.com/media/photo-s/01/3e/05/40/the-sandbar-that-links.jpg");
//        for (int i = 0; i <mImageContainerLayout.getChildCount(); i++) {
//            LinearLayout addItem = (LinearLayout)mImageContainerLayout.getChildAt(i);
//            EditText editText = (EditText)addItem.getChildAt(1);
//           imageUrls.add(editText.getText().toString());
//        }
        // String imageUrl = "XXX";
        // params.putString(Tencent.SHARE_TO_QQ_IMAGE_URL,imageUrl);
       params.putStringArrayList(QzoneShare.SHARE_TO_QQ_IMAGE_URL, imageUrls);
        doShareToQzone(params);
 }
 

2. 回调方法:

privatevoid doShareToQzone(final Bundle params) {
        //final Activity activity =ProductDetailActivity.this;
        new Thread(new Runnable() {  

            @Override
            public void run() {
               Log.e("share","qzone");
                // TODO Auto-generated methodstub
               mQzoneShare.shareToQzone(ProductDetailActivity.this,params, new IUiListener() {  

                    @Override
                    public void onCancel() {
                       //取消分享
                       Log.e("qzone share", "cancel");
                    }  

                    @Override
                    public void onError(UiErrore) {
                       //分享错误
                       Log.e("qzone share", "error: "+e.errorDetail);
                    }  

                     @Override
                    publicvoid onComplete(Object response) {
                        //分享成功
                         Log.e("qzoneshare", "success");
                    }  

                });
            }
        }).start();
    }  

方式二:

当然上面那种方式是比较不符合我们的使用习惯的,比如,我登录了一段时间,先把Activity关闭,我再打开app但是不登录,此时需要做分享处理,上面那个方法就会报空指针异常。此时,我们就需要用这个方法

1. 分享到QQ空间

private void shareToQQzone() {
     final Bundle params = new Bundle();
     params.putInt(QzoneShare.SHARE_TO_QZONE_KEY_TYPE,QzoneShare.SHARE_TO_QZONE_TYPE_IMAGE_TEXT);
     params.putString(QzoneShare.SHARE_TO_QQ_TITLE, "Test");
     params.putString(QzoneShare.SHARE_TO_QQ_SUMMARY,  "content infro");
     params.putString(QzoneShare.SHARE_TO_QQ_TARGET_URL,  "http://www.hicsg.com");
     ArrayList<String> imageUrls = new ArrayList<String>();
       imageUrls.add("http://media-cdn.tripadvisor.com/media/photo-s/01/3e/05/40/the-sandbar-that-links.jpg");
      params.putStringArrayList(QzoneShare.SHARE_TO_QQ_IMAGE_URL, imageUrls);
     params.putInt(QzoneShare.SHARE_TO_QQ_EXT_INT,  QQShare.SHARE_TO_QQ_FLAG_QZONE_AUTO_OPEN);
     Tencent mTencent = Tencent.createInstance(Constant.QQ_KEY,ProductDetailActivity.this);
     mTencent.shareToQzone(ProductDetailActivity.this, params, newBaseUiListener());
  }
 

2.  回调

privateclass BaseUiListener implements IUiListener {
            @Override
            public void onComplete(Objectresponse) {
                //V2.0版本,参数类型由JSONObject 改成了Object,具体类型参考api文档
                doComplete((JSONObject)response);
            }
            protected void doComplete(JSONObjectvalues) {
                //分享成功
            }
            @Override
            public void onError(UiError e) {
                //在这里处理错误信息
                if(e.errorDetail == null){
                     ToastUtil.showToast(ProductDetailActivity.this,getString(R.string.no_qq));
                }else{
                     ToastUtil.showToast(ProductDetailActivity.this,
                            getString(R.string.share_fail)+":"+e.errorDetail);
                }  

            }
            @Override
            public void onCancel() {
                //分享被取消
                ToastUtil.showToast(ProductDetailActivity.this,getString(R.string.share_cancel));
            }
   }  

更多api帮助见api文档:http://wiki.open.qq.com/wiki/Android_API%E8%B0%83%E7%94%A8%E8%AF%B4%E6%98%8E#1.14_.E5.88.86.E4.BA.AB.E5.88.B0QQ.E7.A9.BA.E9.97.B4.EF.BC.88.E6.97.A0.E9.9C.80QQ.E7.99.BB.E5.BD.95.EF.BC.89

别忘了要在代码混淆中添加

-keep class com.tencent.open.TDialog$*
-keep class com.tencent.open.TDialog$* {*;}
-keep class com.tencent.open.PKDialog
-keep class com.tencent.open.PKDialog {*;}
-keep class com.tencent.open.PKDialog$*
-keep class com.tencent.open.PKDialog$* {*;}

P.S

测试的时候,需要开发者账号QQ或者加这个QQ为好友才可以进行测试。

-------------------------------------------个人分享方法------------------------------------------

    public void shareToQQ() {
        final Bundle params = new Bundle();
        params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_DEFAULT);
        //分享的标题。注:PARAM_TITLE、PARAM_IMAGE_URL、PARAM_    SUMMARY不能全为空,最少必须有一个是有值的。
        params.putString(QQShare.SHARE_TO_QQ_TITLE, shareTitle);
        params.putString(QQShare.SHARE_TO_QQ_SUMMARY, shareContent);
        //这条分享消息被好友点击后的跳转URL。
        params.putString(QQShare.SHARE_TO_QQ_TARGET_URL, shareUrlLink);
        //分享的图片URL
        params.putString(QQShare.SHARE_TO_QQ_IMAGE_URL, shareImageLink);
        //手Q客户端顶部,替换“返回”按钮文字,如果为空,用返回代替
        params.putString(QQShare.SHARE_TO_QQ_APP_NAME, mActivity.getString(R.string.app_name));
//        params.putInt(QQShare.SHARE_TO_QQ_EXT_INT, "其他附加功能");
        Tencent mTencent = Tencent.createInstance(AppConstants.KEY_QQ, mActivity);
        mTencent.shareToQQ(mActivity, params, new BaseUiListener());
    }
  private void shareToQQzone() {
        final Bundle params = new Bundle();
        params.putInt(QzoneShare.SHARE_TO_QZONE_KEY_TYPE, QzoneShare.SHARE_TO_QZONE_TYPE_IMAGE_TEXT);
        params.putString(QzoneShare.SHARE_TO_QQ_TITLE, shareTitle);
        params.putString(QzoneShare.SHARE_TO_QQ_SUMMARY, shareContent);
        params.putString(QzoneShare.SHARE_TO_QQ_TARGET_URL, shareUrlLink);
        ArrayList<String> imageUrls = new ArrayList<String>();
        imageUrls.add(shareImageLink);
        params.putStringArrayList(QzoneShare.SHARE_TO_QQ_IMAGE_URL, imageUrls);
        params.putInt(QzoneShare.SHARE_TO_QQ_EXT_INT, QQShare.SHARE_TO_QQ_FLAG_QZONE_AUTO_OPEN);
        Tencent mTencent = Tencent.createInstance(AppConstants.KEY_QQ, mActivity);
        mTencent.shareToQzone(mActivity, params, new BaseUiListener());
    }
    private class BaseUiListener implements IUiListener {
        @Override
        public void onComplete(Object response) {
            //V2.0版本,参数类型由JSONObject 改成了Object,具体类型参考api文档
            doComplete((JSONObject) response);
        }

        protected void doComplete(JSONObject values) {
            //分享成功
//            AppUtils.showToast(mActivity, "分享成功");
        }

        @Override
        public void onError(UiError e) {
            //在这里处理错误信息
            if (e.errorDetail == null) {
                Log.e("QQShareError", "unknown error");
            } else {
                Log.e("QQShareError", e.errorDetail);
            }
        }

        @Override
        public void onCancel() {
            //分享被取消
        }
    }
时间: 2024-10-07 02:20:47

Android中集成QQ登陆和QQ好友分享及QQ空间分享的相关文章

Android中集成第三方库的方法和问题

声明: 1. 本文参考了网上同学们的现有成果,在此表示感谢,参考资料在文后有链接. 2. 本文的重点在第三部分,是在开发中遇到的问题及解决办法.第一,第二部分为参考网上同学们的成果加以整理而成. 3. 欢迎转载,交流,请尊重作者劳动成果:转载请注明出处,谢谢! Android中使用第三方库可能有两种:Java库.jar和原生库.so/.a,如果只是做上层APK开发,这两种库都可以通过Eclipse集成开发环境进行集成,如果是平台级开发,则都可通过源码集成.本文整理这两种集成方式使用步骤,以下假设

Android中集成第三方支付

常见的第三方支付解决方案 支付宝支付 微信支付 银联支付 Ping++统一支付平台(需要继承服务器端和客户端) 短信支付 支付宝的集成流程 相关资料链接: 支付宝支付指引流程:支付指引流程 支付宝Android端集成流程:Android端集成流程 首先,支付宝支付准备工作 首先登录[支付宝开放平台]http://open.alipay.com/platform/home.htm,创建应用,并给应用添加App支付功能 由于App支付功能需要签约,因此需要上传公司信息和证件等资料进行签约 签约成功后

在Android中集成flutter

flutter可能是未来跨平台开发的又一技术框架,那么对于一个app,我们不可能完全用flutter来开发,那么就意味着我们需要在已有的Android代码中去集成flutter.目前这一技术还处于预览状态,并且还要切换flutter的channel为mater分支.如下,官方原话: 那么我们在集成之前需要查看现在flutter处于什么渠道:我的是处于master分支,如果你以前没改过的话,应该是beta分支,那么可以执行: flutter channel master 进行切换. 下面正式开始集

Android Studio 中集成Opencv环境(包含opencv_contrib部分)

我在上一篇博客中说到了在Android中集成OpenCV,但是那个版本的OpenCV是没有SIFT和SURF算法的,因为这些算法是受专利保护的,所以并没有被包含在预编译库中,所以如果想要使用SIFT和SURF算法,需要自己来编译OpenCV Android SDK.在OpenCV 2.4.x版本中,这些算法被包含在nonfree模块中:从3.0版本开始,用于图像特征匹配的一些算法(比如SIFT,SURF,BRIEF,FREAK等)被转移到了opencv_contrib项目的xfeatures2d

在Android中使App高速、简单地支持新浪微博、微信、QQ、facebook等十几个主流社交平台的分享功能

前言 在如今的APP或者游戏中,分享功能差点儿已经成为标配.分享功能不但能够满足用户的需求.也能够为产品带来很多其它的用户,甚至能够对用户的行为.活跃度.年龄段等情况进行数据统计,使得软件公司能够对产品进行更精准的定位.今天我们就来简单剖析市场上一款优秀的分享SDK以及其集成过程.这款分享SDK就是友盟的社会化分享组件. 友盟社会化分享,帮助移动应用高速具备分享.登录.评论.喜欢等社交功能,提升用户粘度.助力产品推广,并提供实时.全面的社会化数据统计分析服务. 很多其它请訪问友盟社会化组件官网.

在Android中使App快速、简单地支持新浪微博、微信、QQ、facebook等十几个主流社交平台的分享功能

前言 在现在的APP或者游戏中,分享功能几乎已经成为标配.分享功能不但能够满足用户的需求,也能够为产品带来更多的用户,甚至可以对用户的行为.活跃度.年龄段等情况进行数据统计,使得软件公司可以对产品进行更精准的定位.今天我们就来简单剖析市场上一款优秀的分享SDK以及其集成过程,这款分享SDK就是友盟的社会化分享组件. 友盟社会化分享,帮助移动应用快速具备分享.登录.评论.喜欢等社交功能,提升用户粘度.助力产品推广,并提供实时.全面的社会化数据统计分析服务. 基本概念 根据友盟的集成文档,我们对于友

解决iOS app集成分享到QQ空间,微信好友,朋友圈等功能,苹果审核无法通过的问题

最近在提交应用到App Store时,因为App集成QQ登录,分享到QQ空间.微信等功能,而被拒,十分郁闷:百思之下,想到一个办法,可以解决此问题. 在将要显示分享平台列表时,根据判断当前设备是否安装了某款App,而进行动态调整,具体操作如下: 首先导入相关头文件 #import <TencentOpenAPI/TencentApiInterface.h> #import "WXApi.h" NSMutableArray *platforms = [[NSMutableAr

Android 中实现分享和第三方登陆---以新浪微博为例

尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38781957 第三方登陆和分享功能在目前大部分APP中都有,分享功能可以将自己觉得有意义的东西分享给身边的朋友,而第三方登陆可以借助已经有巨大用户基础的平台(如QQ和新浪微博)的账号,让用户在使用自己APP的时候不用注册,直接使用第三方账号登陆,从而避免了注册的过程(其实是服务器端帮你注册),这对于吸引更多的用户非常有意义.下面我们就以新浪微博为例,讲解如何实现分享功能和第三方登陆.首先你

Android中使用ExpandableListView实现好友分组

一个视图显示垂直滚动两级列表中的条目.这不同于列表视图,允许两个层次,类似于QQ的好友分组.要实现这个效果的整体思路为: 1.要给ExpandableListView 设置适配器,那么必须先设置数据源. 2.数据源,就是此处的适配器类,此方法继承了BaseExpandableListAdapter,它是ExpandableListView的一个子类.需要重写里面的多个方法.方法的意思,代码中都有详细的注释.数据源中,用到了自定义的View布局,此时根据自己的需求,来设置组和子项的布局样式.get