我有同样的问题,但我找到了解决方法。
如果删除了OBB,那么doesFileExist(在Helpers.java中)将返回false。在您检查expansionFilesDelivered的ExpDownloaderActivity中,您将使用此信息重新下载OBB。
我已经改变了doesFileExist和expansionFilesDelivered的方式不返回一个布尔值,但具有以下含义的整数
时间filestatus == 0:OBB丢失(必须下载)
时间filestatus == 1:OBB可用,并且可以被解包到另一个地方
时间filestatus == 2:在OBB数据已经存储到另一个地方
查阅特技TE: 拆包d后ata从OBB到我最喜欢的地方,我用一个只包含原始OBB文件大小的文件替换原始OBB作为字符串。这释放了SD卡上占用的空间。
对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,并与内部存储文件大小比较(这是文件大小shouldt是什么) 。如果这给了一个匹配,我知道该文件已经被处理。
这是我在我的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提到的 - 无需要SD卡上的空间才能获得完整的OBB 和解压后的数据。
“我们有许多用户在其”外部“SD卡上有很多可用空间,但内部空间有限” - 从Android的角度来看,没有这样的概念。只有一个外部存储器,由'getExternalStorageDirectory()'表示。除此之外的任何事情都是由于设备制造商扩展到Android,其中Play Expansion APK的东西什么也不知道。 – CommonsWare 2013-03-09 01:10:23