如何在android上通过Cocos2d-x获取截图保存路径
Posted
技术标签:
【中文标题】如何在android上通过Cocos2d-x获取截图保存路径【英文标题】:How to get screenshot saved path by Cocos2d-x on android 【发布时间】:2014-07-14 09:44:54 【问题描述】:我使用saveToFile方法保存截图,我查看CCLOG,它显示/data/data/com.xxx.xxx/files/xxx.png
但是,当我使用 Java 获取此文件时,它显示“没有这样的文件或目录”.... 我能做什么?
【问题讨论】:
尝试保存到SD卡然后访问 这是我失败的部分,我可以在 SD 卡上打开一个新文件夹,但是当我将“文件路径”从 C++ 传递到 Java 以保存到画廊时,它返回一个错误说 NullPointerException ... 文件 f = new File(filePath); //f.createNewFile();位图 imageBitmap = BitmapFactory.decodeFile(f.getAbsolutePath());试试 f.createNewFile(); FileOutputStream ostream = new FileOutputStream(f); imageBitmap.compress(CompressFormat.PNG, 100, ostream); ostream.flush(); ostream.close();这是我写的代码......我对Java不熟悉...... 我可以通过C++中的“saveToFile”路径创建精灵,但是通过data/data/找不到设备上的图片文件.....奇怪=.=跨度> 使用getWritablePath()
这将返回文件写入的位置。
【参考方案1】:
我遇到了同样的问题。显然,cocos2dx 从不创建可写路径目录,因此不会保存屏幕截图。
我的解决方案是,而不是调用 CCRenderTexture::saveToFile
,而是复制其实现并将文件手动保存到不同的路径:
std::string MyClass::takeScreenshot(CCScene* scene)
cocos2d::CCSize screenSize = cocos2d::CCDirector::sharedDirector()->getWinSize();
cocos2d::CCRenderTexture* tex = cocos2d::CCRenderTexture::create(screenSize.width, screenSize.height);
tex->setPosition(ccp(screenSize.width/2, screenSize.height/2));
//use a different dir than cocos default writable path
std::string filename = "/sdcard/android/data/screenshot.png";
tex->begin();
scene->getParent()->visit();
cocos2d::CCImage* img = tex->newCCImage(true);
img->saveToFile(filename.c_str(), true);
CC_SAFE_DELETE(img);
tex->end();
return filename;
【讨论】:
【参考方案2】:我也遇到了同样的问题。当我尝试renderTexture->saveToFile
方法时,我无法提交java 路径。没关系,我用getWritablePath()
或者直接设置路径"/sdcard/Android/data/com.xxx.xxx/snapshot.jpg"
。
我也尝试根据Facundo Olano 的建议来解决这个问题。但是CCImage
仅构成纯黑色图像。
最后我将这两种方法结合起来。首先,我通过renderTexture->saveToFile
制作图片:
void MyScene::pressFaceBook()
...
RenderTexture* renderTexture = RenderTexture::create(sharedImage->getBoundingBox().size.width, sharedImage->getBoundingBox().size.height, Texture2D::PixelFormat::RGBA8888);
renderTexture->begin();
sharedImage->visit();
renderTexture->end();
renderTexture->saveToFile("snapshot.jpg", Image::Format::JPG);
const std::string fullpath = FileUtils::getInstance()->getWritablePath() + "snapshot.jpg";
sharedImage->setVisible(false);
this->runAction(Sequence::create(DelayTime::create(2.0f),
CallFunc::create(std::bind(&MyScene::shareFaceBook, this, fullpath)),
NULL));
然后我将initWithImageFile
与传输的文件名一起使用:
void MyScene::shareFaceBook(const std::string& outputFile)
const std::string joutputFile = "/sdcard/Android/data/com.xxx.xxx/snapshot.jpg";
cocos2d::Image* img = new Image;
img->initWithImageFile(fullpath);
img->saveToFile(joutputFile);
CC_SAFE_DELETE(img);
singleton->shareFaceBook(joutputFile);
截屏需要延迟 2 秒。 当然,您必须用您的应用名称代替 com.xxx.xxx。
【讨论】:
以上是关于如何在android上通过Cocos2d-x获取截图保存路径的主要内容,如果未能解决你的问题,请参考以下文章