首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Android读取OBB文件内容时出错

使用Android读取OBB文件内容时出错
EN

Stack Overflow用户
提问于 2013-08-08 22:08:58
回答 1查看 5K关注 0票数 6

我使用OBB保存数据,需要使用Android访问数据。但是,我似乎不能挂载obb文件来检索数据。根据APK扩展文件文档的说法,我用这个计划来命名我的目标。

例如,main.1.com.example.native_activity.obb

然后,我将其放在/data/Android/obb/com.example.本会_activity文件夹下,这是上面的在线文档所建议的。

但是,通过使用以下代码,我无法进行obb挂载:

代码语言:javascript
复制
AStorageManager* man = AStorageManager_new();
char* data = malloc(256);
AStorageManager_mountObb(man, "main.1.com.example.native_activity.obb", "somekey", my_obbCallbackFunc, data);
char* obbPath = AStorageManager_getMountedObbPath(man, "main.1.com.example.native_activity.obb");

LOGI("mounted path: %s", obbPath);
free(data);
data = NULL;
AStorageManager_delete(man);
man = NULL;

结果证明,obbPath始终是空的。我不知道如何得到正确的钥匙,所以这只是随机化。

更新

我从我这边纠正了两个问题。

首先,obb文件不是使用Android工具创建的,而是从zip文件中重命名的。因此,我使用以下方法重新创建了文件:

代码语言:javascript
复制
jobb -d assets/ -o obb/main.1.com.example.native_activity.obb -k mykey -pn com.example.native_activity -pv 11

把它推到下面

代码语言:javascript
复制
/sdcard/Android/obb/com.example.native_activity/

然后,我在mountObb调用中使用了键和回调函数,代码如下:

代码语言:javascript
复制
char obbPath[256];
sprintf(obbPath, "/sdcard/Android/obb/com.example.native_activity/main.1.com.example.native_activity.obb");
struct stat sts;
if(stat(obbPath, &sts) == -1)
{
    LOGI("File not found: %s\n", obbPath);
}
else
{
    LOGI("File found: %s", obbPath);
}

AStorageManager* man = AStorageManager_new();
char* data = malloc(256);
AStorageManager_mountObb(man, obbPath, "mykey", my_obbCallbackFunc, data);
char* mntPath = AStorageManager_getMountedObbPath(man, obbPath);

int isMounted = AStorageManager_isObbMounted(man, obbPath);

LOGI("mounted path: %s, already mounted?: %d", mntPath, isMounted);
free(data);
data = NULL;
AStorageManager_delete(man);
man = NULL;
return 1;

和回调

代码语言:javascript
复制
void my_obbCallbackFunc(const char* filename, const int32_t state, void* data)
{
    LOGI("my_obbCallbackFunc: %d", state);
}

我得到的Logcat输出:

代码语言:javascript
复制
08-09 08:45:15.960: I/native-activity(9166): Touched screen.
08-09 08:45:15.960: I/native-activity(9166): File found: /sdcard/Android/obb/com.example.native_activity/main.1.com.example.native_activity.obb
08-09 08:45:15.960: E/Parcel(9166): Reading a NULL string not supported here.
08-09 08:45:15.960: I/native-activity(9166): mounted path: , already mounted?: 0
08-09 08:45:15.970: I/native-activity(9166): Touched screen.
08-09 08:45:15.970: I/native-activity(9166): File found: /sdcard/Android/obb/com.example.native_activity/main.1.com.example.native_activity.obb
08-09 08:45:15.970: E/Parcel(9166): Reading a NULL string not supported here.
08-09 08:45:15.970: I/native-activity(9166): mounted path: , already mounted?: 0
08-09 08:45:16.030: I/native-activity(9166): my_obbCallbackFunc: 1
08-09 08:45:16.030: I/native-activity(9166): my_obbCallbackFunc: 24
08-09 08:45:16.030: I/native-activity(9166): my_obbCallbackFunc: 24
08-09 08:45:16.030: I/native-activity(9166): my_obbCallbackFunc: 24
08-09 08:45:16.030: I/native-activity(9166): my_obbCallbackFunc: 24
08-09 08:45:16.030: I/native-activity(9166): my_obbCallbackFunc: 24
08-09 08:45:16.030: I/native-activity(9166): my_obbCallbackFunc: 24

根据android-ndk-r8d/platforms/android-9/arch-arm/usr/include/android/storage_manager.h,回调的错误代码意味着

代码语言:javascript
复制
AOBB_STATE_MOUNTED = 1,
AOBB_STATE_ERROR_ALREADY_MOUNTED = 24,

但是,这与AStorageManager_isObbMounted()调用的返回值中的logcat输出相矛盾,后者读取的是它尚未挂载。

我完全糊涂了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-09 17:43:35

我自己解决了。

挂载查询API肯定有一些违反直觉的地方,因为当我检查文件系统时,obb已经安装在/mnt/obb/下,但是API一直返回0,拒绝给我路径。它可能(细节语义在任何地方都没有记录)意味着这个 from请求未能获得安装的obb,尽管文件之前已经挂载过(回调中的错误代码24 )。

因此,如果我先卸载,然后再挂载在代码中,它应该是好的。因此,基本上添加如下:

代码语言:javascript
复制
AStorageManager_unmountObb(man, obbPath, 1, my_obbCallbackFunc, data);

在此之前

代码语言:javascript
复制
AStorageManager_mountObb(man, obbPath, "mykey", my_obbCallbackFunc, data);

通过回调:

代码语言:javascript
复制
void my_obbCallbackFunc(const char* filename, const int32_t state, void* data)
{
    LOGI("my_obbCallbackFunc: %d", state);

    AStorageManager* man = AStorageManager_new();
    int isMounted = AStorageManager_isObbMounted(man, filename);
    char* mntPath = AStorageManager_getMountedObbPath(man, filename);

    LOGI("my_obbCallbackFunc: fn: %s: mounted path: %s, already mounted?: %d", filename, mntPath, isMounted);
    AStorageManager_delete(man);
}

成功的产出:

代码语言:javascript
复制
08-09 10:41:53.060: I/native-activity(10753): File found: /sdcard/Android/obb/com.example.native_activity/main.1.com.example.native_activity.obb
08-09 10:41:53.070: E/Parcel(10753): Reading a NULL string not supported here.
08-09 10:41:53.070: I/native-activity(10753): mounted path: , already mounted?: 0
08-09 10:41:53.080: I/native-activity(10753): Touched screen.
08-09 10:41:53.080: I/native-activity(10753): File found: /sdcard/Android/obb/com.example.native_activity/main.1.com.example.native_activity.obb
08-09 10:41:53.110: I/native-activity(10753): my_obbCallbackFunc: 2
08-09 10:41:53.110: E/Parcel(10753): Reading a NULL string not supported here.
08-09 10:41:53.110: I/native-activity(10753): mounted path: , already mounted?: 0
08-09 10:41:53.110: E/Parcel(10753): Reading a NULL string not supported here.
08-09 10:41:53.110: I/native-activity(10753): my_obbCallbackFunc: fn: /storage/Android/obb/com.example.native_activity/main.1.com.example.native_activity.obb: mounted path: , already mounted?: 0
08-09 10:41:53.110: I/native-activity(10753): Touched screen.
08-09 10:41:53.110: I/native-activity(10753): File found: /sdcard/Android/obb/com.example.native_activity/main.1.com.example.native_activity.obb
08-09 10:41:53.110: E/Parcel(10753): Reading a NULL string not supported here.
08-09 10:41:53.110: I/native-activity(10753): mounted path: , already mounted?: 0
08-09 10:41:53.130: I/native-activity(10753): Touched screen.
08-09 10:41:53.130: I/native-activity(10753): File found: /sdcard/Android/obb/com.example.native_activity/main.1.com.example.native_activity.obb
08-09 10:41:53.130: E/Parcel(10753): Reading a NULL string not supported here.
08-09 10:41:53.130: I/native-activity(10753): mounted path: , already mounted?: 0
08-09 10:41:53.260: I/native-activity(10753): my_obbCallbackFunc: 1
08-09 10:41:53.300: I/native-activity(10753): my_obbCallbackFunc: 2
08-09 10:41:53.300: E/Parcel(10753): Reading a NULL string not supported here.
08-09 10:41:53.300: I/native-activity(10753): my_obbCallbackFunc: fn: /storage/Android/obb/com.example.native_activity/main.1.com.example.native_activity.obb: mounted path: , already mounted?: 1
08-09 10:41:53.300: E/Parcel(10753): Reading a NULL string not supported here.
08-09 10:41:53.300: I/native-activity(10753): my_obbCallbackFunc: fn: /storage/Android/obb/com.example.native_activity/main.1.com.example.native_activity.obb: mounted path: , already mounted?: 0
08-09 10:41:53.490: I/native-activity(10753): my_obbCallbackFunc: 1
08-09 10:41:53.520: I/native-activity(10753): my_obbCallbackFunc: 2
08-09 10:41:53.520: E/Parcel(10753): Reading a NULL string not supported here.
08-09 10:41:53.520: I/native-activity(10753): my_obbCallbackFunc: fn: /storage/Android/obb/com.example.native_activity/main.1.com.example.native_activity.obb: mounted path: , already mounted?: 0
08-09 10:41:53.520: E/Parcel(10753): Reading a NULL string not supported here.
08-09 10:41:53.520: I/native-activity(10753): my_obbCallbackFunc: fn: /storage/Android/obb/com.example.native_activity/main.1.com.example.native_activity.obb: mounted path: , already mounted?: 1
08-09 10:41:53.680: I/native-activity(10753): my_obbCallbackFunc: 1
08-09 10:41:53.720: I/native-activity(10753): my_obbCallbackFunc: 2
08-09 10:41:53.720: E/Parcel(10753): Reading a NULL string not supported here.
08-09 10:41:53.720: I/native-activity(10753): my_obbCallbackFunc: fn: /storage/Android/obb/com.example.native_activity/main.1.com.example.native_activity.obb: mounted path: , already mounted?: 1
08-09 10:41:53.720: E/Parcel(10753): Reading a NULL string not supported here.
08-09 10:41:53.720: I/native-activity(10753): my_obbCallbackFunc: fn: /storage/Android/obb/com.example.native_activity/main.1.com.example.native_activity.obb: mounted path: , already mounted?: 0
08-09 10:41:53.870: I/native-activity(10753): my_obbCallbackFunc: 1
08-09 10:41:53.880: I/native-activity(10753): my_obbCallbackFunc: fn: /storage/Android/obb/com.example.native_activity/main.1.com.example.native_activity.obb: mounted path: /mnt/obb/437f5d6d13a1da1d3b41bb46963e3720, already mounted?: 1

UPDATE:在使它完全工作之前,我还必须修复几个曲折:

  1. 在使用jobb创建OBB时,除了正确命名文件外,-pv选项还必须与清单中的正确versionCode一起使用。
  2. 每当需要对相同的OBB进行更新时,例如,OBB文件名中的versionCode保持不变,但内容已经改变,需要首先显式地删除设备上的OBB。否则,一个简单的亚行推动的OBB就不会奏效。您将继续在挂载回调中获得AOBB_STATE_ERROR_COULD_NOT_MOUNT (错误代码21)。这鼓励了版本化的使用,但使得在同一个OBB上进行临时测试很难,也就是说,不增加versionCode就不“建议”继续更改OBB。这意味着您需要首先删除OBB,以“覆盖”完全相同的OBB文件。
  3. 许多教程的重点是教您如何使用下载库,以及如何对GooglePlay进行上载/下载舞蹈。如果您想要做的就是测试本地访问OBB,那是完全可以忽略的。
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18137020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档