2013-03-08 37 views
3

我们使用Google Play扩展APK机制获得了大至600MB的扩展文件。我们还必须解压缩此文件以供实际使用。整个应用程序和数据因此需要大约1.4 GB的存储空间。Google Play扩展文件位置

据我所知,Google Play坚持要将.obb下载到“内部”SD中,并且似乎没有任何方法可以改变这一点。我们有许多用户在其“外部”SD卡上有很多可用空间,但内部空间有限。他们尖叫的应用程序占用了太多的空间。我们能做些什么吗?

我们目前扩大.obb文件:

getExternalStorageDirectory()/安卓/数据

我想我们可以问他们想它的用户,他们可以选择真正的外置SD卡。但是,这仍然会在内部SD卡上留下(很大程度上没用的).obb文件,Google Play表示我们无法删除此文件。

有没有人有任何建议如何正确处理这个问题?

+0

“我们有许多用户在其”外部“SD卡上有很多可用空间,但内部空间有限” - 从Android的角度来看,没有这样的概念。只有一个外部存储器,由'getExternalStorageDirectory()'表示。除此之外的任何事情都是由于设备制造商扩展到Android,其中Play Expansion APK的东西什么也不知道。 – CommonsWare 2013-03-09 01:10:23

回答

1

Expansion File Storage Location documentation,扩展文件存储在

<shared-storage>/Android/obb/<package-name>/ 

其中shared-storage是什么,是由getExternalStorageDirectory(),这应该是在SD卡上有一个SD卡的用户返回。

不幸的是,相同的网页上说:

为了确保正确的行为,你不能删除,移动或重命名扩展文件。

我会采取特别注意这一段:

如果您必须解压扩展文件的内容,事后删除.obb扩展文件和保存将数据解压到同一目录中。您应该将解压后的文件保存在getExternalFilesDir()指定的目录中。但是,如果可能的话,最好使用扩展文件格式,以便直接从文件中读取数据,而不是要求解压数据。例如,我们提供了一个名为APK Expansion Zip Library的库项目,它直接从ZIP文件中读取数据。

+0

感谢您的回复。问题是,对于许多设备有2个SD卡。一个内部和一个外部(可移动)的。 getExternalStorageDirectory()似乎总是返回通常具有更多有限存储空间的内部SD卡。我们必须非常快速地访问.obb文件(和C代码)中的数据,因此我们必须扩展它。 – btschumy 2013-03-09 01:30:20

1

把OBB文件放在其他任何地方的问题是,当用户卸载你的应用程序时,它们不会被删除,而这往往会让他们陷入一种不好的心情,以轻微地陈述它。但是,如果您认为利益大于成本,则没有任何技术可以阻止您更改存储位置,因为提供了验证的源代码,您可以修改其行为以满足您的需求。

例如,在OBB文件的存储路径由com.google.android.vending.expansion.downloader.Helpers提供:

static public String getSaveFilePath(Context c) { 
    File root = Environment.getExternalStorageDirectory(); 
    String path = root.toString() + Constants.EXP_PATH + c.getPackageName(); 
    return path; 
} 

(还需要修改getFilesystemRoot(String path) & isFilenameValid(String filename))如果你使用谷歌的扩张压缩文件的lib以及

,那么您还需要更改com.android.vending.expansion.zipfile.APKExpansionSupport中指定Environment.getExternalStorageDirectory()作为根目录的3个方法。

这些变化应该至少让你在那里。

另外请注意,与外部SD卡的问题是,他们的速度差异很大,通常是内部标准偏差至少有体面的速度。也许你可以将OBB分成2个文件(假设你不需要更新文件功能),并将其中一个移动到外部SD。

+0

我对这个系统进行黑客攻击并不感兴趣。我真正的问题是如果我错过了某个地方的设置,以便在外部SD卡上发生这种情况。从CommonWare上面的评论听起来好像没有。 – btschumy 2013-03-09 15:56:22

+0

没有。但它不会破解系统,因为它不属于Android平台。这只是一套库加服务,由Google Play应用提供。 – Kai 2013-03-09 16:43:14

0

我有同样的问题,但我找到了解决方法。

如果删除了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 解压后的数据。

相关问题