如何在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获取截图保存路径的主要内容,如果未能解决你的问题,请参考以下文章

如何在android上通过降低音量和电源键来截取屏幕截图?

android 怎么获取当前屏幕的截图

Android 截屏方式

如何在win7上搭建Android cocos2d-x-3.3开发环境

android 如何获取手机当前的Activity实例

如何使用命令对Android系统进行截屏