[建议]ccui的代码中尽量使用相对路径

ccui的代码中,很多地方都直接使用了绝对路径,正常情况下没有问题,但是在某些情况下可能会工作不正常。

以我们的一个项目为例,游戏启动时会下载资源,并保存到sd卡上。
由于操作系统会自动扫描sd卡上的所有图片文件,所以下载的图片资源会出现在手机相册里。因此我们对图片文件名做了混淆,比如"a.png",实际上存储的名字是"a.xxx".
FileUtils的setFilenameLookupDictionary()方法可以实现这个功能。

假设某个界面 a.json,用到了图片a.png。
apk中包含
/res/a.json
/res/a.xxx
如果某次更细资源后,a.png做了修改,那么
apk中包含
/res/a.json
/res/a.xxx
/sdcard/xxx/res/a.xxx

如果通过a.json的绝对路径/res/a.json,来计算a.png的绝对路径,得到
pngPath = “a.png”
pngFullPath = “/res/a.png”

有3个问题

  1. 计算出的绝对路径是 /res, 而不是/sdcard/xxx/res
  2. 文件名是a.png,而不是a.xxx
    3.有的地方要根据扩展名判断类型, 用pngFullPath不正确。

结论:
代码中尽量不使用绝对路径,把路径问题交给FileUtils处理。

目前是相对路径,不过应该是相对json的路径才对。

ComRender::serialize()里面用到了绝对路径

if (file != nullptr)
        {
            filePath.assign(cocos2d::FileUtils::getInstance()->fullPathForFilename(file));
        }
        if (plist != nullptr)
        {
            plistPath.assign(cocos2d::FileUtils::getInstance()->fullPathForFilename(plist));
        }

fullpath之前记录了json的路径,这一部分的源码改掉即可 :14:

GUIReader::m_strFilePath 也是绝对路径

首先,cocostudio导出文件中没有使用filenameLookupDictionary。
其次,如果你可以使用.nomedia文件来阻止媒体库扫描你的媒体文件。

下面引用developer.android.com的话:

— Begin quote from ____

Hiding your files from the Media Scanner

Include an empty file named .nomedia in your external files directory (note the dot prefix in the filename). This prevents media scanner from reading your media files and providing them to other apps through the MediaStore content provider.

— End quote

http://developer.android.com/guide/topics/data/data-storage.html

原来还有.nomedia这个东西,学习了。

cocostudio本身虽然没有用到lookupDictionary,但是实际应用的过程中,大家会根据自己的需求使用的。