cocos2d-x C++ (Android)集成第三方微信分享
ShareSDK Android for cocos2d-x
此文档为ShareSDK Android for cocos3.x的版本,如您集成的是2.X的版本文档请到这里:cocos2.x集成文档
1.1、下载ShareSDK的cocos2d-x工具类
打开Github下载C2DX-For-ShareSDK-3.X项目(注意:这里下载的只供cocos2d-x 3.x使用)。将项目中的C2DXShareSDK目录拷贝到你的项目中。
1.2、修改AppDelegate文件
打开“AppDelegate.cpp”文件,导入头文件“C2DXShareSDK.h”。如:
#include "C2DXShareSDK.h"
在AppDelegate::applicationDidFinishLaunching方法中,加入下面代码进行初始化ShareSDK并配置社交平台信息。还要记得写上c++的命名空间,代码如下:
using namespace cn::sharesdk; bool AppDelegate::applicationDidFinishLaunching()
{
//初始化ShareSDK
this->initShareSDKConfig();
} void AppDelegate::initShareSDKConfig()
{
//平台配置信息
__Dictionary *totalDict = __Dictionary::create(); //以新浪微博为例子,如需在代码配置平台的信息,各个平台对应字段的key请参考,assets>ShareSDK.xml里面的字段
__Dictionary *sinaWeiboConf= __Dictionary::create();
sinaWeiboConf->setObject(__String::create("1"), "Id");
sinaWeiboConf->setObject(__String::create("1"), "SortID");
sinaWeiboConf->setObject(__String::create("568898243"), "AppKey");
sinaWeiboConf->setObject(__String::create("38a4f8204cc784f81f9f0daaf31e02e3"), "AppSecret");
sinaWeiboConf->setObject(__String::create("http://www.sharesdk.cn"), "RedirectUrl");
sinaWeiboConf->setObject(__String::create("false"), "ShareByAppClient");
sinaWeiboConf->setObject(__String::create("true"), "Enable");
stringstream sina;
sina << cn::sharesdk::C2DXPlatTypeSinaWeibo; totalDict->setObject(sinaWeiboConf, sina.str()); /*Android可以代码里面配置凭他信息,也在assets>ShareSDK.xml里面配置信息,需要读取XMl的话,registerAppAndSetPlatformConfig第一个参数需要传""空字符串;*/
cn::sharesdk::C2DXShareSDK::registerAppAndSetPlatformConfig("android1101", totalDict);
}
注意:其中配置社交平台信息中的配置项说明,请参考《社交平台配置项说明》文档。
1.3、分享内容
先构造分享内容结构,代码如下(注意文件编码如果不为utf-8会导致所有的内容都为Null):
Dictionary *content = Dictionary::create();
content -> setObject(String::create("这是一条测试内容"), "content");
content -> setObject(String::create("http://img0.bdstatic.com/img/image/shouye/systsy-11927417755.jpg"), "image");
content -> setObject(String::create("测试标题"), "title");
content -> setObject(String::create("测试描述"), "description");
content -> setObject(String::create("http://sharesdk.cn"), "url");
content -> setObject(String::createWithFormat("%d", C2DXContentTypeWebPage), "type");
content -> setObject(String::create("http://sharesdk.cn"), "siteUrl");
content -> setObject(String::create("ShareSDK"), "site");
content -> setObject(String::create("http://mp3.mwap8.com/destdir/Music/2009/20090601/ZuiXuanMinZuFeng20090601119.mp3"), "musicUrl");
content -> setObject(String::create("extInfo"), "extInfo");
Dictionary可用的Key如下,如果需要用到其它字段,可自行参考Sample中的代码实现: (并不是所有平台都有这些字段,需要参考文档 Android_不同平台分享内容的详细说明)
Key | 描述 |
---|---|
text/content | 要分享的内容,注意在文档中content对应的是text字段 |
description | 内容简要,评论 |
image | 要分享的图片,可以是本地路径imagePath(如:/sdcard/a.jpg)或是一个网址imageUrl |
title | 要分享的标题 |
titleUrl | QQ和QQ空间分享的网页链接 |
url | 网页分享,仅需要图文分享时,不要传这个字段 |
type | 内容类型,具体参考enum C2DXContentType |
site | 内容来源的站点名称 |
siteUrl | 内容来源的站点链接 |
musicUrl | 音乐分享,音乐文件的网址 |
extInfo | 微信分享应用时传给应用的附加信息,参考微信API文档 |
然后将内容传入分享接口:
<strong>两种分享形式</strong>
//显示分享菜单(九宫格)
C2DXShareSDK::showShareMenu(NULL, content, 100, 100, shareContentResultHandler); //单独平台分享(以微博为例)
C2DXShareSDK::shareContent(cn::sharesdk::C2DXPlatTypeSinaWeibo, content, shareContentResultHandler);
其中shareContentResultHandler为回调方法,其定义如下:
//分享回调
void shareContentResultHandler(int seqId, cn::sharesdk::C2DXResponseState state, cn::sharesdk::C2DXPlatType platType, __Dictionary *result)
{
switch (state)
{
case cn::sharesdk::C2DXResponseStateSuccess:
{
log("Success");
}
break;
case cn::sharesdk::C2DXResponseStateFail:
{
log("Fail");
//回调错误信息
__Array *allKeys = result->allKeys();
allKeys->retain();
for (int i = 0; i < allKeys-> count(); i++)
{
__String *key = (__String*)allKeys->getObjectAtIndex(i);
Ref *obj = result->objectForKey(key->getCString()); log("key = %s", key -> getCString());
if (dynamic_cast<__String *>(obj))
{
log("value = %s", dynamic_cast<__String *>(obj) -> getCString());
}
else if (dynamic_cast<__Integer *>(obj))
{
log("value = %d", dynamic_cast<__Integer *>(obj) -> getValue());
}
else if (dynamic_cast<__Double *>(obj))
{
log("value = %f", dynamic_cast<__Double *>(obj) -> getValue());
}
}
}
break;
case cn::sharesdk::C2DXResponseStateCancel:
{
log("Cancel");
}
break;
default:
break;
}
}
1.4、用户授权
调用C2DXShareSDK中的authorize方法可进行用户授权。代码如下:
C2DXShareSDK::authorize(C2DXPlatTypeSinaWeibo, authResultHandler);
其中authResultHandler为回调方法,其定义如下:
//授权回调
//获取用户信息结果回调
void getUserResultHandler(int reqID, C2DXResponseState state, C2DXPlatType platType, __Dictionary *result)
{
switch (state)
{
case cn::sharesdk::C2DXResponseStateSuccess:
{
log("Success");
if (result == NULL) {
break;
}
//输出信息
try
{
__Array *allKeys = result -> allKeys();
allKeys->retain();
for (int i = 0; i < allKeys -> count(); i++)
{
__String *key = (__String *)allKeys -> getObjectAtIndex(i);
Ref *obj = result -> objectForKey(key -> getCString()); log("key = %s", key -> getCString());
if (dynamic_cast<__String *>(obj))
{
log("value = %s", dynamic_cast<__String *>(obj) -> getCString());
}
else if (dynamic_cast<__Integer *>(obj))
{
log("value = %d", dynamic_cast<__Integer *>(obj) -> getValue());
}
else if (dynamic_cast<__Double *>(obj))
{
log("value = %f", dynamic_cast<__Double *>(obj) -> getValue());
}
}
allKeys->release();
}
catch(...)
{
log("==============error");
}
}
break;
case cn::sharesdk::C2DXResponseStateFail:
{
log("Fail");
//回调错误信息
if (result == NULL) {
break;
}
__Array *allKeys = result->allKeys();
allKeys->retain();
for (int i = 0; i < allKeys-> count(); i++)
{
__String *key = (__String*)allKeys->getObjectAtIndex(i);
Ref *obj = result->objectForKey(key->getCString()); log("key = %s", key -> getCString());
if (dynamic_cast<__String *>(obj))
{
log("value = %s", dynamic_cast<__String *>(obj) -> getCString());
}
else if (dynamic_cast<__Integer *>(obj))
{
log("value = %d", dynamic_cast<__Integer *>(obj) -> getValue());
}
else if (dynamic_cast<__Double *>(obj))
{
log("value = %f", dynamic_cast<__Double *>(obj) -> getValue());
}
}
}
break;
case cn::sharesdk::C2DXResponseStateCancel:
{
log("Cancel");
}
break;
default:
break;
}
}
1.5、获取用户资料
调用C2DXShareSDK中的getUserInfo方法可获取授权用户信息。代码如下:
C2DXShareSDK::getUserInfo(C2DXPlatTypeSinaWeibo, getUserResultHandler);
其中getUserResultHandler为回调方法,其定义如下:
//获取用户信息结果回调
void getUserResultHandler(int reqID, C2DXResponseState state, C2DXPlatType platType, __Dictionary *result)
{
switch (state)
{
case cn::sharesdk::C2DXResponseStateSuccess:
{
log("Success");
if (result == NULL) {
break;
}
//输出信息
try
{
__Array *allKeys = result -> allKeys();
allKeys->retain();
for (int i = 0; i < allKeys -> count(); i++)
{
__String *key = (__String *)allKeys -> getObjectAtIndex(i);
Ref *obj = result -> objectForKey(key -> getCString()); log("key = %s", key -> getCString());
if (dynamic_cast<__String *>(obj))
{
log("value = %s", dynamic_cast<__String *>(obj) -> getCString());
}
else if (dynamic_cast<__Integer *>(obj))
{
log("value = %d", dynamic_cast<__Integer *>(obj) -> getValue());
}
else if (dynamic_cast<__Double *>(obj))
{
log("value = %f", dynamic_cast<__Double *>(obj) -> getValue());
}
}
allKeys->release();
}
catch(...)
{
log("==============error");
}
}
break;
case cn::sharesdk::C2DXResponseStateFail:
{
log("Fail");
//回调错误信息
if (result == NULL) {
break;
}
__Array *allKeys = result->allKeys();
allKeys->retain();
for (int i = 0; i < allKeys-> count(); i++)
{
__String *key = (__String*)allKeys->getObjectAtIndex(i);
Ref *obj = result->objectForKey(key->getCString()); log("key = %s", key -> getCString());
if (dynamic_cast<__String *>(obj))
{
log("value = %s", dynamic_cast<__String *>(obj) -> getCString());
}
else if (dynamic_cast<__Integer *>(obj))
{
log("value = %d", dynamic_cast<__Integer *>(obj) -> getValue());
}
else if (dynamic_cast<__Double *>(obj))
{
log("value = %f", dynamic_cast<__Double *>(obj) -> getValue());
}
}
}
break;
case cn::sharesdk::C2DXResponseStateCancel:
{
log("Cancel");
}
break;
default:
break;
}
}
(不集成Android分享可略过此部分)
注意:
本节介绍的是结合Jni将Share SDK集成到coco2d-x的方式,如果您想查询“纯Java方式”的集成方法,请点击这里参考“Android 示例项目”条目的相关内容,如果您想查询“plugin-x”的集成方法,请点击这里参考“Android 示例项目”条目的相关内容。
集成步骤
集成到你的cocos2dx里要做的是
1:把ShareSDK的cocos2dx的sample项目里的libs架包复制到你的项目里,除了armeabi目录不用复制其他都要。
2:把ShareSDK的cocos2dx的sample项目里的Classes目录下的文件都复制到你的项目里的Classes目录下。
3:把ShareSDK的cocos2dx的sample项目里的res里的drawable-xhdpi和values目录下的oks_string.xml、ssdk_string.xml复制到你的项目里的res目录下,values-en是国际化需要用到的
4:把ShareSDK的cocos2dx的sample项目里的AndroidManifest.xml里的<activity android:name=”com.mob.tools.MobUIShell” />的属性和<user-permission>都复制到你的项目里的AndroidManifes.xml里,如果需要集成微信分享还需要设置微信的回调activity,具体如何写可以查阅 Android_快速集成指南 的配置AndroidManifes.xml节点。
5:添加代码把ShareSDKUtils.java一定要放在cn.sharesdk目录下,onekeyshare是做快捷分享,onekeyshare也在cn.sharesdk下创建变成cn.sharesdk.onekeyshare,然后把onekeyshare代码复制到你的项目里
6:在主activity里的onCreate方法里添加ShareSDKUtils.prepare()方法。
7:在jni/Android.mk添加下面代码来引入相关文件,如:
LOCAL_SRC_FILES := hellocpp/main.cpp \
../../Classes/AppDelegate.cpp \
../../Classes/HelloWorldScene.cpp \
../../Classes/C2DXShareSDK/Android/ShareSDKUtils.cpp \
../../Classes/C2DXShareSDK/C2DXShareSDK.cpp \
../../Classes/C2DXShareSDK/Android/JSON/CCJSONConverter.cpp \
../../Classes/C2DXShareSDK/Android/JSON/cJSON/cJSON.c
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes \
$(LOCAL_PATH)/../../Classes/C2DXShareSDK \
$(LOCAL_PATH)/../../Classes/C2DXShareSDK/Android \
$(LOCAL_PATH)/../../Classes/C2DXShareSDK/Android/JSON \
$(LOCAL_PATH)/../../Classes/C2DXShareSDK/Android/JSON/cJSON
8、在项目属性页选择C/C++ builder,在build command处填入python ${ProjDirPath}/build_native.py -b release (注意需要安装python,ndk要使用r9或者更高版本)
9、添加一些环境变量
添加COCOS2DX_ROOT,也就是cocos2dx解压缩的根目录
如果你没有设置系统变量NDK_ROOT,那么要添加系统变量或在这里添加NDK_ROOT,也就是NDK解压缩的根目录
如果你没有设置系统变量,那么要添加系统变量或在这里添加ANDROID_SDK_ROOT,也就是Android SDK的根目录
10、设置一下资源的环境变量
在这个页面点击Link Source…按钮
路径指向COCOS2DX根目录\cocos\platform\android\java\src,Folder name: libcocos2d或其它不存在的名称
11、最后尝试执行项目,点击分享正常显示此图就表明集成ShareSDK C2DX成功了,恭喜你
- ShareSDK.xml配置文件说明
里面配置的信息是你的应用到各个分享平台注册你的应用时所返回的注册信息,把项目的注册信息填写到ShareSDK.xml
详细的JAVA代码说明和配置信息说明请查阅Android快速集成指南
此demo不能执行分享功能,因为没有到各个分享平台里注册此应用信息,所以要你的应用到各个分享平台里注册应用信息后把相关的注册信息填写到ShareSDK.xml就能执行分享了,祝你顺利。
分享过程中出现异常请查阅常见问题板块
3.2 java层代码解释
java层代码基本上只有ShareSDKUtils一个类,而且java层的代码也仅仅需要调用这个类的prepare方法,此外的可以不理会。但是如果您想修改分享的参数(github上的例子提供的分享参数很少),则需要涉及下面的方法:
nativeMapToJavaMap(HashMap<String, String>)
这个方法是将从native层传递上来的分享数据的名称修改为java层可以理解的名称,如果您在native层添加了分享的参数,则需要修改这个方法,将这些参数“翻译”为Java层可以理解的字段,
这些字段实际上就是不同平台ShareParams的字段,完整列表,可以参考这里。
onekeyShare(HashMap<String, String>)
这个方法是调用java层快捷分享GUI模块的入口,和上面的方法一样,如果您修改了native层的分享参数,这个方法里面的方法也需要增删。
需要特别注意的是,ShareSDKUtils.prepare()必须在主线程中调用,而且需要在触发Share SDK的任何操作前触发,否则会因为没有初始化ShareSDKUtils而导致错误。
3.3 native层代码解释
直接使用jni的方式集成Share SDK并不是Android平台所推荐的做法,实践证明,这种方式需要涉及大量的native-java反射操作,低效且容易发生错误,但是这种方法可以在编写c/c++代码时屏蔽平台差异,也可以当作是对Plugin-x的补充。
native层的代码基本上是反射操作,开发者可以完全不理会其实现,直接调用C2DXShareSDK上的方法完成需要的功能即可,如果需要修改其中的功能,可以到ShareSDKUtils中改动,但是需要注意下面的方法:
Java_cn_sharesdk_Cocos2dPlatformActionListener_onCancel
Java_cn_sharesdk_Cocos2dPlatformActionListener_onComplete
Java_cn_sharesdk_Cocos2dPlatformActionListener_onError
这三个方法是java层的操作回调,不应该修改方法的名称
hashmapToCCDictionary及其引用的方法
这个方法的用途主要是将包含操作返回的json容器hashmap转成ccdictionary
CCDictionaryToHashMap
这个方法是hashmapToCCDictionary的逆操作,但事实上这个方法只能转换key和value都是string的数据
cocos2d-x C++ (Android)集成第三方微信分享的更多相关文章
- cocos2d-x C++ (iOS)集成第三方微信分享
1.新建项目并下载 ShareSDK 1.Cocos2d-x项目环境搭建,不会的童鞋自行面壁哈: 网页链接. 2.ShareSDK iOS版本的 Cocos2d-x 插件是在ShareSDK iOS版 ...
- Android集成第三方微信登录
第一步: 在微信开放平台创建安卓应用,需要输入的包名和签名就不用再提吧,不知道的自行百度. 应用创建完毕后会得到两个值:AppID.AppSecret,用这两个值来请求微信. 然后去微信开放平台的资源 ...
- Android开发 对接微信分享SDK总结
原文:Android开发 对接微信分享SDK总结 - Stars-One的杂货小窝 公司项目需要对接微信分享,本来之前准备对接友盟分享的,但友盟的分享实际参数太多,而我又只需要对接一个微信分享,于是便 ...
- [转载]Android平台第三方应用分享到微信开发
一.申请APPID 微信公共平台和微博分享一样,也需要申请一个ID,来作为调起微信.分享到微信的唯一标识. 申请微信APPID可以到微信平台http://open.weixin.qq.com/app/ ...
- Android平台第三方应用分享到微信开发
一.申请APPID 微信公共平台和微博分享一样,也需要申请一个ID,来作为调起微信.分享到微信的唯一标识. 申请微信APPID可以到微信平台http://open.weixin.qq.com/app/ ...
- Android应用加入微信分享
一.申请你的AppID http://open.weixin.qq.com/ 友情提示:推荐使用eclipse打包软件最后一步的MD5值去申请AppID 二.官网下载libammsdk.jar包 ht ...
- android APP 中微信分享功能实现 的总结
//花了很长时间最终完成了微信分享功能,中间走了很多弯路,在此做一下小结,希望对在应用中使用到微信分享的朋友有所帮助. 主要问题就是下面两个: 1.为什么运行了项目之后,微信分享只是闪了一下就没有了? ...
- android 集成友盟分享之后,想自定义分享面板的看过来
第一种情况 首先上传一张默认的友盟分享的效果图 看起来还不错,但是总是有这样那样的原因,需要我们对默认效果做出一些改变. 第二种情况 如果你想做出下面的效果: 或者这样的效果 : 总之上面的效果总是在 ...
- Android app 第三方微信支付接入详解
微信支付做了好几遍了,都没有出现什么棘手的问题,下面一一为大家分享一下,欢迎吐槽. 还是老样子,接入微信的支付要第一步添加微信支付官方的包libammsdk.jar 首先就处理略坑的一个问题,app应 ...
随机推荐
- DataProtection设置问题引起不同ASP.NET Core站点无法共享用户验证Cookie
这是这两天ASP.NET Core迁移中遇到的一个问题.2个ASP.NET Core站点(对应于2个不同的ASP.NET Core Web应用程序),2个站点都可以登录,但在其中任1个站点登录后,在当 ...
- TensorRT 进行推理
- utf-8 utf8
mysql> DROP TABLE IF EXISTS student; Query OK, 0 rows affected (0.00 sec) mysql> create table ...
- 常用css属性
一.常用css属性 (1) *block(区块) 行高 line-height:数值 | inherit | normal;字间距 letter-spacing: 数值 | inherit | nor ...
- [ovs] openvswitch 入门
https://www.sdnlab.com/sdn-guide/14747.html http://sdnhub.cn/index.php/openv-switch-full-guide/ http ...
- [hyperscan][pkg-config] hyperscan 从0到1路线图
经过一系列的研究学习,知识储备之后,终于,可以开始研究hyperscan了. [knowledge][模式匹配] 字符匹配/模式匹配 正则表达式 自动机 [knowledge][perl][pcre] ...
- 新的ipad,用xcode编译报错 dyld_shared_cache_extract_dylibs
删掉 ~/Library/Developer/Xcode/iOS DeviceSupport/ 这个目录下的特定文件夹就行啦. 其实是因为 device is busy 生成文件夹过程中拔掉了设 ...
- 20165225 2017-2018-2《Java程序设计》课程总结
20165225 2017-2018-2<Java程序设计>课程总结 - 每周作业链接汇总: 预备作业一:我期待的师生关系 预备作业二:学习基础和C语言基础调查 预备作业三:linux安装 ...
- Python开发【笔记】:获取目录下所有文件
获取文件 import os def sub_dirs(rdir): li = os.listdir(rdir) return li def main(rdir): content = sub_dir ...
- 1、python同级目录及子目录模块引入
2个模块在同一个包内时(即引入和被引入的2个py文件在同一个目录下),直接引入模块名 1.引入与被引入模块或包在同一目录下时,直接引入模块名或者包名import modulename.py或者impo ...