我有同样的问题,但我找到了解决它的方法。
如果你删除了 OBB,doesFileExist(在 Helpers.java 中)将返回 false。在您的 ExpDownloaderActivity 中,您检查扩展文件已交付,您将使用此信息重新下载 OBB。
我已经更改了 dosFileExist 和 expansionFilesDelivered 以不返回布尔值而是返回具有以下含义的整数:
fileStatus == 0:OBB 丢失(必须下载)
fileStatus == 1:OBB可用,可以解压到其他地方
fileStatus == 2:OBB中的数据已经存储到另一个地方
现在技巧:将数据从 OBB 解压到我最喜欢的位置后,我将原始 OBB 替换为同名的文件,该文件仅包含原始 OBB 的文件大小作为字符串。这释放了 sdcard 上的占用空间。
进一步调用doesFileExist 和expansionFilesDelivered 将返回filestatus = 2,这意味着不需要任何操作。
这是我在 Helpers.java 中的更改:
static public int doesFileExist(Context c, String fileName, long fileSize,
boolean deleteFileOnMismatch) {
// the file may have been delivered by Market --- let's make sure
// it's the size we expect
File fileForNewFile = new File(Helpers.generateSaveFileName(c, fileName));
if (fileForNewFile.exists()) {
if (fileForNewFile.length() == fileSize) {
return 1;
} else if (fileForNewFile.length() < 100) {
// Read the file and look for the file size inside
String content = "";
long isSize = 0;
FileInputStream fis = null;
try {
fis = new FileInputStream(fileForNewFile);
char current;
while (fis.available() > 0) {
current = (char) fis.read();
content = content + String.valueOf(current);
}
} catch (Exception e) {
Log.d("ReadOBB", e.toString());
} finally {
if (fis != null)
try {
fis.close();
} catch (IOException ignored) {
}
}
try {
isSize = Long.parseLong(content);
} catch(NumberFormatException nfe) {
Log.d("ReadOBBtoInt", nfe.toString());
}
if (isSize == fileSize) {
return 2;
}
}
if (deleteFileOnMismatch) {
// delete the file --- we won't be able to resume
// because we cannot confirm the integrity of the file
fileForNewFile.delete();
}
}
return 0;
}
如果 OBB 的文件大小不匹配,我会读取 OBB 并与存储在其中的文件大小进行比较(这是文件大小不应该的)。如果这给出了匹配,我知道该文件已被处理。
这是我在 ExpDownloaderActivity 中的更改:
int expansionFilesDelivered() {
int fileStatus = 0;
for (XAPKFile xf : xAPKS) {
if (xf.mFileSize > 0) {
String fileName = Helpers.getExpansionAPKFileName(this, xf.mIsMain, xf.mFileVersion);
fileStatus = Helpers.doesFileExist(this, fileName, xf.mFileSize, false);
if (fileStatus==0)
return 0;
}
}
return fileStatus;
}
在 ExpDownloaderActivity 的 onCreate 中:
initializeDownloadUI();
int fileStatus = expansionFilesDelivered();
if (fileStatus==0) { // OBB is missing
// ... Download the OBB file, same as on Downloader example
} else if (fileStatus==1) {
validateXAPKZipFiles(); // and, if OBB has no errors, unpack it to my favorite place
// if done, create a new OBB file with the original name
// and store a string with the original filesize in it.
} else {
finish(); // No action required }
因此,我可以在任何我想要的地方解压缩数据,并且 - 正如 OP 所提到的 - 不需要 sdcard 上的空间来存储完整的 OBB 和解压缩的数据。