我试图从本机端访问图像文件中的资产的文件夹。 现在,我可以通过资产文件夹及其子目录定位,我寻找的特定文件成功搜索:
AAssetDir* assetDir = AAssetManager_openDir(asset_manager, "images");
const char* filename;
while ((filename = AAssetDir_getNextFileName(assetDir)) != NULL)
{
__android_log_print(ANDROID_LOG_DEBUG, "Debug", filename);
}
AAssetDir_close(assetDir);
我也使用OSG。 我设置的图像作为纹理着色器我用下面的代码:
texture->setImage(osgDB::readImageFile(fileNameWithPath));
但是,文件名必须包括绝对路径,以及因为它不位于同一目录中。 但是我发现我不能得到这些资产目录的绝对路径,是它与APK一起被压缩。
是,我无法访问的绝对路径,还有什么其他的方式可以我用得到的形象呢? 另外需要注意的,我也想保持这些文件的资产文件夹放在附近的SD卡。
你可以阅读从资产图像AAssetManager_open
& AAsset_read
,但由于资产位于APK你不能为它取一个文件路径名-它也压缩在那里。 您可以将数据保存到一个文件,后来从该文件中读取或者你可以直接处理从您的资源文件了,如果OSG允许块。
从这里 :
AAssetDir* assetDir = AAssetManager_openDir(mgr, "");
const char* filename = (const char*)NULL;
while ((filename = AAssetDir_getNextFileName(assetDir)) != NULL) {
AAsset* asset = AAssetManager_open(mgr, filename, AASSET_MODE_STREAMING);
char buf[BUFSIZ];
int nb_read = 0;
FILE* out = fopen(filename, "w");
while ((nb_read = AAsset_read(asset, buf, BUFSIZ)) > 0)
fwrite(buf, nb_read, 1, out);
fclose(out);
AAsset_close(asset);
}
AAssetDir_close(assetDir);
一个更值得一提的是,Android的投入限制在可以在时间被读取,1MB的资产规模。 如果你的文件比这更大,你必须把它分割成块。 这里是一个加载文件块到矢量字符的我工作的解决方案:
AAssetManager * mgr = app->activity->assetManager;
AAssetDir* assetDir = AAssetManager_openDir(mgr, "");
const char* filename;
std::vector<char> buffer;
while ((filename = AAssetDir_getNextFileName(assetDir)) != NULL)
{
//search for desired file
if(!strcmp(filename, /* searched file name */))
{
AAsset *asset = AAssetManager_open(mgr, filename, AASSET_MODE_STREAMING);
//holds size of searched file
off64_t length = AAsset_getLength64(asset);
//keeps track of remaining bytes to read
off64_t remaining = AAsset_getRemainingLength64(asset);
size_t Mb = 1000 *1024; // 1Mb is maximum chunk size for compressed assets
size_t currChunk;
buffer.reserve(length);
//while we have still some data to read
while (remaining != 0)
{
//set proper size for our next chunk
if(remaining >= Mb)
{
currChunk = Mb;
}
else
{
currChunk = remaining;
}
char chunk[currChunk];
//read data chunk
if(AAsset_read(asset, chunk, currChunk) > 0) // returns less than 0 on error
{
//and append it to our vector
buffer.insert(buffer.end(),chunk, chunk + currChunk);
remaining = AAsset_getRemainingLength64(asset);
}
}
AAsset_close(asset);
}
}