基于cocos2d-x开发(我的是V2.2.3),分享的方法有很多,例如用SharedSDK,或者直接用各个开发平台的SDK,但对于android平台,如果要求不是很高的话,有一种简单的方式(Intent组件+jni)。
1.假如工程名是LCX,那首先修改LCX.java
public static void nativeShare()
{
//需要开线程执行
new Thread(new Runnable()
{
@Override
public void run() {
Intent shareIt = new Intent("android.intent.action.SEND");
shareIt.setType("image/*");
shareIt.putExtra(Intent.EXTRA_SUBJECT, "Share");
shareIt.putExtra(Intent.EXTRA_TEXT, "Content");
//分享sd卡的图片shareIt.putExtra(Intent.EXTRA_STREAM,Uri.parse("file:data/data/" + getContext().getApplicationInfo().packageName+ "/files/myShare.png"));
shareIt.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getContext().startActivity(Intent.createChooser(shareIt, "Share"));
}
}).start();
}
2.然后是cocos2d-x截屏分享部分
包含头文件:
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include "platform/android/jni/JniHelper.h"
#endif
然后在分享回调中加入代码:
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
CCRenderTexture* pTexture = CCRenderTexture::create((int)winSize.width, (int)winSize.height,kCCTexture2DPixelFormat_RGBA8888);
pTexture->getSprite()->setAnchorPoint( ccp(0.5f,0.5f) );
pTexture->setPosition( ccp(winSize.width/2, winSize.height/2) );
pTexture->setAnchorPoint( ccp(0.5f,0.5f) );
pTexture->begin();
this->visit();
pTexture->end();//保存文件,路径在data/data/包名/files/中
pTexture->saveToFile("myShare.png",kCCImageFormatPNG);
//分享
JniMethodInfo jni_method_info;
if (JniHelper::getStaticMethodInfo(jni_method_info, "com/test/LCX", "nativeShare", "()V")) {
jni_method_info.env->CallStaticVoidMethod(jni_method_info.classID, jni_method_info.methodID);
}#endif //CC_PLATFORM_ANDROID
这样基本就ok了,系统会搜索所有可以分享的应用(新浪微博,腾讯微博,人人等),然后列出一个菜单供用户选择。
3.另外,CCRenderTexture的saveToFile方法保存的文件不是所有应用都可以访问的,例如新浪微博,所以建议把文件保存在sdcard中,这样就方便很多应用访问了。
android的sdcard路径是不定的,各个手机不一定相同,不能写死。但是貌似cocos2dx没有接口返回sd的路径,所以我们自己通过jni获取。
首先添加sd写权限,修改AndroidManifest.xml,如下:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
然后修改LCX.java
public static String nativeGetSDPath()
{
//判断sd卡是否存在
if (Environment.getExternalStorageState()
.equals(android.os.Environment.MEDIA_MOUNTED))
{
return Environment.getExternalStorageDirectory().toString();//获取跟目录
}
return null;
}
然后替换saveToFile的代码(红色部分)
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
CCRenderTexture* pTexture = CCRenderTexture::create((int)winSize.width, (int)winSize.height,kCCTexture2DPixelFormat_RGBA8888);
pTexture->getSprite()->setAnchorPoint( ccp(0.5f,0.5f) );
pTexture->setPosition( ccp(winSize.width/2, winSize.height/2) );
pTexture->setAnchorPoint( ccp(0.5f,0.5f) );
pTexture->begin();
this->visit();
pTexture->end();
pTexture->saveToFile("myShare.png",kCCImageFormatPNG);
JniMethodInfo t;
std::string ret("");
if (JniHelper::getStaticMethodInfo(t, "com/test/LCX", "nativeGetSDPath", "()Ljava/lang/String;")) {
jstring str = (jstring)t.env->CallStaticObjectMethod(t.classID, t.methodID);
t.env->DeleteLocalRef(t.classID);
ret = JniHelper::jstring2string(str);
t.env->DeleteLocalRef(str);
CCImage *pImage = pTexture->newCCImage(true);
if (pImage)
{
std::string fullpath = ret + "/myShare.png";
pImage->saveToFile(fullpath.c_str(), true);
}
CC_SAFE_DELETE(pImage);
}
JniMethodInfo jni_method_info;
if (JniHelper::getStaticMethodInfo(jni_method_info, "com/test/LCX", "nativeShare", "()V")) {
jni_method_info.env->CallStaticVoidMethod(jni_method_info.classID, jni_method_info.methodID);
}
最后修改nativeShare函数 shareIt.putExtra(Intent.EXTRA_STREAM,Uri.parse(nativeGetSDPath()+"/myShare.png"));
shareIt.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); getContext().startActivity(Intent.createChooser(shareIt, "Share"));
好了大功告成!!!
后续:
cocos2d-x 3.2后有新的接口,utils::captureScreen,具体参考http://cn.cocos2d-x.org/tutorial/show?id=1737