Как извлечь файлы из файла .obb?

в моем приложении я загрузил файл расширения в Android->obb->packagename->main.1.packagename.obb . Может ли кто-нибудь объяснить мне, даже с примером кода, как извлечь из него мои файлы?

Я попытался использовать Zip-библиотеку расширения APK как:

ZipResourceFile expansionFile = APKExpansionSupport.getAPKExpansionZipFile(MainActivity.this, 3, 0);  
for (ZipResourceFile.ZipEntryRO entry : expansionFile.getAllEntries())
Log.d("",entry.mFileName);
InputStream input = expansionFile.getInputStream(Environment.getExternalStorageDirectory().toString()
                            + "/sdcard/Android/obb/com.example.project/main.3.com.example.project.obb/obb/file.zip/file.apk");

Но файл расширения всегда равен нулю. Файл .obb был создан с помощью Jobb и использовался в папке obb/file.zip.


person Lorenzo Salani    schedule 13.07.2015    source источник
comment
что ты уже испробовал? Документация по расширению APK на самом деле очень хороша.   -  person Khalos    schedule 14.07.2015


Ответы (2)


Решается с помощью следующего кода:

    final StorageManager storageManager = (StorageManager) getSystemService(STORAGE_SERVICE);
    String obbPath = Environment.getExternalStorageDirectory() + "/Android/obb";
    final String obbFilePath = obbPath + "/com.example.project/main.3.com.example.project.obb";
    OnObbStateChangeListener mount_listener = new OnObbStateChangeListener() {
          public void onObbStateChange(String path, int state) {
                if (state == OnObbStateChangeListener.MOUNTED) {
                      if (storageManager.isObbMounted(obbFilePath)) {
                            Log.d("Main","Mounted successful");
                            String newPath  = storageManager.getMountedObbPath(obbFilePath);
                            File expPath = new File(newPath+"/file.zip/file.apk");
                            Log.d("Main","File exist: " + expPath.exists());
                      }
                }
          }
    };
    storageManager.mountObb(obbFilePath, "key", mount_listener);

После монтирования файла .obb я могу получить доступ к своим данным по пути mnt/obb/myfolder.

person Lorenzo Salani    schedule 14.07.2015

Я использовал это для чтения определенного файла из obb:

В вашем AndroidManifest.xml:

<!-- Needed for reading the obb file -->
<provider
    android:name=".extension.ZipFileContentProvider"
    android:authorities="com.example.extension.ZipFileContentProvider"/>

ZipFileContentProvider:

public class ZipFileContentProvider extends APEZProvider {
  @Override
  public String getAuthority() {
    return "com.example.extension.ZipFileContentProvider";
  }
}

Получить URI файла:

final Uri CONTENT_URI = Uri.parse("content://" + "com.example.extension.ZipFileContentProvider");
Uri uri = Uri.parse(CONTENT_URI + "/drawable/" + name)

Чтобы создать файл obb, я использовал скрипт gradle (папка res находится в том же каталоге):

task createExpansionFile(type: Zip) {
  from 'res'

  entryCompression = ZipEntryCompression.STORED
  archiveName = 'main' + '.' + '1' + '.' + 'com.example' + '.obb'

  println archiveName
  println relativePath(destinationDir)
  println relativePath(archivePath)
}
person Philipp E    schedule 14.07.2015