本文讲解如何在cocos2dx安卓工程中添加分享到微信的功能,以安卓为例,ios和wp同理。
1 环境
- windows7 64位
- vs2010
- eclipse+adt
- jdk
- android-sdk
- android-ndk
- cygwin
- cocos2dx 2.2.5
2创建cocos2dx安卓工程
用命令行创建cocos2dx项目,包名com.tashaxing.cocoswechat,工程名cocoswechat,然后导入eclipse编译成安卓apk。
参看:http://www.jb51.cc/article/p-qdgwtjgr-r.html
3对应用包签名
下载微信开放平台官方提供的apk包签名工具Gen_Signature.apk(地址:签名工具),对生成的apk签名,签名时要求被签名应用包和签名工具两个应用都安装在同一个安卓机器上(虚拟机也行,虚拟机需要设置sd卡,否则打不开朋友圈)
例如,我创建的项目包名com.tashaxing.cocoswechat,将生成的apk和Gen_Signature.apk都安到虚拟机,然后打开签名工具进行签名。
(注意:一台电脑对应一个签名,如果中途更换了开发电脑,即使工程的包名相同,签名也会不同,所以开发中不能更换开发PC)
4申请创建微信应用
在微信开放平台上申请创建移动应用,获取AppID。微信开放平台的网址是:https://open.weixin.qq.com/
(1)注册账号,进入管理中心,创建应用
(2)填写各项信息
填写包名和签名就可以提交审核了,等待2-3天就能通过审核获得APPID。
如图,审核已经通过,获得了AppID,这个AppID对应唯一的一个安卓包和唯一的签名,任何一个没有对上就没有权限分享到微信。另外,普通应用只有分享到朋友圈和好友的权限,如果需要支付、登录等接口,需要申请开通。
5集成微信安卓sdk到工程
(1)下载微信安卓sdk,去官网 微信安卓sdk下载
(2)打开下载的Android_SDK.zip。解压,将lib目录下的libammsdk.jar拷到cocos2dxwechat项目下的libs目录。
(3)右键单击工程,选择Build Path中的Configure Build Path...,选中Libraries这个tab,并通过Add Jars...导入工程libs目录下的libammsdk.jar文件。
有时候eclipse导入这个jar有上层的referenced libraries这个目录,可能是eclipse版本的原因吧,效果一样,不影响。
在src/com/tashaxing/cocoswechat目录下添加Util.java这个文件用于后面的图片解码。
打开cocoswechat.java,做以下操作:
看代码:
package com.tashaxing.cocoswechat; import org.cocos2dx.lib.Cocos2dxActivity; import org.cocos2dx.lib.Cocos2dxGLSurfaceView; import android.os.Bundle; //import the exra things import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.widget.Toast; import com.tashaxing.cocoswechat.R; import com.tencent.mm.sdk.modelmsg.SendMessageToWX; import com.tencent.mm.sdk.modelmsg.WXMediaMessage; import com.tencent.mm.sdk.modelmsg.WXWebpageObject; import com.tencent.mm.sdk.openapi.IWXAPI; import com.tencent.mm.sdk.openapi.WXAPIFactory; public class cocoswechat extends Cocos2dxActivity { // 添加成员变量 private static final String APP_ID = "wxf8f45bb6d7154d29"; //这里就是申请的APP_ID了 private static IWXAPI api; private static cocoswechat instance; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 注册到微信 instance = this; regToWX(); } private void regToWX() { api = WXAPIFactory.createWXAPI(this,APP_ID,true); api.registerApp(APP_ID); } //发送给好友或者群聊 public static void sendMsgToFriend() { System.out.println("sendMsgToFriend"); if (api.openWXApp()) { WXWebpageObject webpage = new WXWebpageObject(); webpage.webpageUrl = "http://blog.csdn.net/u012234115"; WXMediaMessage msg = new WXMediaMessage(webpage); msg.title = "踏莎行的cocos2dx分享"; msg.description = "来自踏莎行的cocos2dx手机游戏分享测试"; Bitmap thumb = BitmapFactory.decodeResource( instance.getResources(),R.drawable.icon); // 解析图标,就是分享到微信的那个title图标 msg.thumbData = Util.bmpToByteArray(thumb,true); SendMessageToWX.Req req = new SendMessageToWX.Req(); req.transaction = buildTransaction("webpage"); req.message = msg; req.scene = SendMessageToWX.Req.WXSceneSession; api.sendReq(req); } else { Toast.makeText(instance,"未安装微信",Toast.LENGTH_SHORT) .show(); } } //发送到朋友圈 public static void sendMsgToTimeLine() { if (api.openWXApp()) { if (api.getWXAppSupportAPI() >= 0x21020001) { WXWebpageObject webpage = new WXWebpageObject(); webpage.webpageUrl = "http://blog.csdn.net/u012234115"; WXMediaMessage msg = new WXMediaMessage(webpage); msg.title = "踏莎行的cocos2dx分享"; msg.description = "来自踏莎行的cocos2dx手机游戏分享测试"; Bitmap thumb = BitmapFactory.decodeResource( instance.getResources(),R.drawable.icon); msg.thumbData = Util.bmpToByteArray(thumb,true); SendMessageToWX.Req req = new SendMessageToWX.Req(); req.transaction = buildTransaction("webpage"); req.message = msg; req.scene = SendMessageToWX.Req.WXSceneTimeline; api.sendReq(req); } else { Toast.makeText(instance,"微信版本过低",Toast.LENGTH_SHORT).show(); } } else { Toast.makeText(instance,Toast.LENGTH_SHORT).show(); } } //用于生成唯一的会话标示符 private static String buildTransaction(final String type) { return (type == null) ? String.valueOf(System.currentTimeMillis()) : type + System.currentTimeMillis(); } public Cocos2dxGLSurfaceView onCreateView() { Cocos2dxGLSurfaceView glSurfaceView = new Cocos2dxGLSurfaceView(this); // cocoswechat should create stencil buffer glSurfaceView.setEGLConfigChooser(5,6,5,16,8); return glSurfaceView; } static { System.loadLibrary("cocos2dcpp"); } }
(5)jni调用
在工程的Classes文件夹下添加一个类的h文件和cpp文件,包含2个静态函数,c++中调用java的接口。
void WechatShare::sendToFriend() { #if (CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID) JniMethodInfo minfo; bool isHave=JniHelper::getStaticMethodInfo(minfo,"com/tashaxing/cocoswechat/cocoswechat","sendMsgToFriend","()V"); if(!isHave) return; else minfo.env->CallStaticVoidMethod(minfo.classID,minfo.methodID); #endif } void WechatShare::sendToTimeLine() { #if (CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID) JniMethodInfo minfo; bool isHave=JniHelper::getStaticMethodInfo(minfo,"sendMsgToTimeLine",minfo.methodID); #endif }
例如把调用分享到微信朋友圈的代码写在一个菜单项的回调函数中:
void HelloWorld::menuWechatShareCallback(CCObject* pSender) { #if (CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID) //WechatShare::sendToTimeLine(); WechatShare::sendToTimeLine(); #endif }
(7)工程Android.mk的修改
LOCAL_SRC_FILES := hellocpp/main.cpp \ ../../Classes/AppDelegate.cpp \ ../../Classes/HelloWorldScene.cpp\ ../../Classes/WechatShare.cpp
(8)AnroidManifest.xml中开启微信相关权限(可选)
<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" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
其中具有第一个联网权限(默认自带)就可以实现分享了,其他三个可以不要。
6重新交叉编译为apk
安装到安卓机器,效果图:
源码下载:demo