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.89
http://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() {
//分享被取消
}
}

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

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

    Android中集成第三方库的方法和问题 声明: 1. 本文參考了网上同学们的现有成果,在此表示感谢,參考资料在文后有链接. 2. 本文的重点在第三部分,是在开发中遇到的问题及解决的方法.第一,第二部 ...

  2. Android中集成ffmpeg(一):编译ffmpeg

    方案选择 Android中集成ffmpeg的codec功能无非两种方式: JNI直接调用,主要用于App开发(无权限修改系统底层),如EXOPlayer,JPlayer等. 集成ffmpeg到OMX, ...

  3. Android中集成第三方支付

    常见的第三方支付解决方案 支付宝支付 微信支付 银联支付 Ping++统一支付平台(需要继承服务器端和客户端) 短信支付 支付宝的集成流程 相关资料链接: 支付宝支付指引流程:支付指引流程 支付宝An ...

  4. Android中集成支付宝

    手机的在线支付,被认为是2012年最看好的功能,我个人认为这也是移动互联网较传统互联网将会大放光彩的一个功能. 人人有手机,人人携带手机,花钱买东西,不再需要取钱付现,不再需要回家上网银,想买什么,扫 ...

  5. phonegap(cordova) 自己定义插件代码篇(五)----android ,iOS 集成微信登陆

    统一登陆还是非常有必要的,安全,放心.代码 /*cordov 微信自己定义插件*/ (function (cordova) { var define = cordova.define; define( ...

  6. OpenCV - Android Studio 中集成Opencv环境(包含opencv_contrib部分)

    我在上一篇博客中说到了在Android中集成OpenCV,但是那个版本的OpenCV是没有SIFT和SURF算法的,因为这些算法是受专利保护的,所以并没有被包含在预编译库中,所以如果想要使用SIFT和 ...

  7. android中的SQLite数据库

    SQLite是android中集成的一个轻量级的数据库,该数据库支持绝大部分SQL92语法 SQLiteDatabase代表一个数据库(底层就是一个数据库文件),一旦应用程序获得了代表指定数据库的SQ ...

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

    前言 在如今的APP或者游戏中,分享功能差点儿已经成为标配.分享功能不但能够满足用户的需求.也能够为产品带来很多其它的用户,甚至能够对用户的行为.活跃度.年龄段等情况进行数据统计,使得软件公司能够对产 ...

  9. 在RecyclerView中集成QQ汽泡二

    上次已经将GooView集成到RecyclerView当中了[http://www.cnblogs.com/webor2006/p/7787511.html],但是目前还有很多问题,下面先来运行看一下 ...

随机推荐

  1. DataGridView使用技巧五:自动设定列宽和行高

    一.设定行高和列宽自动调整 设定包括Header和所有单元格的列宽自动调整 //设置包括Header和所有单元格的列宽自动调整 this.dgv_PropDemo.AutoSizeColumnsMod ...

  2. 利用Nginx搭建RTMP视频直播,点播服务器,ffmpeg推流,回看

        一.环境和工具 ubuntu 14.04 desktop 不用server的原因是一部分的演示用到了linux视频播放和直播软件,自己还要装桌面,麻烦. 不建议使用 最新的16TLS,我一开始 ...

  3. node-webkit读取json文件

    1.原理 node-webkit包含了node.js,node.js提供了处理json数据文件的方法,通过node.js提供的方法,我们可以比较方便地读取json文件. 2.示例 这里我们读取的文件是 ...

  4. 关于ajax get方式请求 url地址参数怎么变成空了的问题

    如URL地址:http://i.cnblogs.com/EditPosts.aspx?opt=1&value=#sgsgs; 今天在做项目中发现value明明是有值,怎么出在的后台往往取不到 ...

  5. ggplot2——简介

    ggplot2是R语言最为强大的作图软件包,强于其自成一派的数据可视化理念.当熟悉了ggplot2的基本套路后,数据可视化工作将变得非常轻松而有条理. 本文主要对ggplot2的可视化理念及开发套路做 ...

  6. oop-Inheritance & Polymorphism

    本文主要作为java学习笔记,方便以后查看,大部分内容都源于以下网站: http://www.ntu.edu.sg/home/ehchua/programming/index.html#Game 本文 ...

  7. firefox插件之 vimperator 的使用

    简介: vimperator 是 Firefox浏览器下的一个插件,可以让我们像使用vim 一样使用 firefox浏览器,高效畅快,不用鼠标了.它的官网为:http://www.vimperator ...

  8. 修改MySQL的默认密码的四种小方法

    投稿:lijiao 字体:[增加 减小] 类型:转载 时间:2015-09-05我要评论 对于windows平台来说安装完MySQL后,系统就已经默认生成了许可表和账户,下文中就教给大家如何修改MyS ...

  9. (转)MFC的ClistCtrl删除选中多行项目

    MFC的ClistCtrl控件添加了多行数据后,若要删除选中的多行数据,可以使用ClistCtrl的成员函数,在网上找了很多例子,发现都有问题,因为在删除ClistCtrl行的时候,删除行下面的行会上 ...

  10. thinkphp隐藏模块实例

    1.项目中若要隐藏模块的做法 2.配置如下: <?php return array( //'配置项'=>'配置值' 'MODULE_ALLOW_LIST' => array ('Ho ...