У меня была такая же проблема, но я нашел способ ее решить.
Если вы удалите OBB, то makeFileExist (в Helpers.java) вернет false. В вашей ExpDownloaderActivity, где вы проверяете расширениеFilesDelivered, вы будете использовать эту информацию для повторной загрузки OBB.
Я изменил doesFileExist и expansionFilesDelivered таким образом, чтобы не возвращать логическое значение, но целое число со следующим значением:
fileStatus == 0: ФЖДА отсутствует (должен быть загружен)
fileStatus == 1: ФЖДА доступен и может быть распакованы в другое место
fileStatus == 2: данные в OBB уже хранится в другое место
Теперь те трик: После распаковки д ata от OBB до моего любимого места, я заменяю оригинальный OBB файлом с тем же именем, которое содержит только размер файла исходного OBB в виде строки. Это освобождает занятое пространство на SD-карте.
Дальнейшие вызовы toFileExist и expandFilesDelivered возвращают 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 не совпадают, я прочитал ÖBB и сравнить с размер_файла хранится внутри (это то, что размер файла 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;
}
В OnCreate в ExpDownloaderActivity:
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 }
Так что у меня данные распакованы, где я хочу, и - как уже упоминалось ОП - нет необходимо пространство на SD-карте для полного OBB и распакованных данных.
«У нас много пользователей с большим количеством свободного места на их« внешней »SD-карте, но ограниченное пространство на внутреннем», - с точки зрения Android, такой концепции нет. Существует только одно внешнее хранилище, представленное 'getExternalStorageDirectory()'. Все, что выходит за рамки этого, связано с расширением производителя устройств для Android, из которых материал APK расширения воспроизведения ничего не знает. – CommonsWare