Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 扩展文件-复制和使用_Java_Android_Apk Expansion Files - Fatal编程技术网

Java 扩展文件-复制和使用

Java 扩展文件-复制和使用,java,android,apk-expansion-files,Java,Android,Apk Expansion Files,我一直在看一些不同的教程,但我真的很难确切地看到如何首先将扩展文件复制到用户无法访问的位置,以及如何在我的实际应用程序中使用它们 我将在扩展文件中有很多关键图像,因此还需要防止用户在下载所有内容之前玩游戏 最后,我还必须访问大量图像的基于密度的部分,以及少量原始文件(如视频),这是我目前必须解决的问题,即在扩展文件中打开哪个文件夹 String ExpansionFolder = ""; switch (getResources().getDisplayMetrics().densityDpi)

我一直在看一些不同的教程,但我真的很难确切地看到如何首先将扩展文件复制到用户无法访问的位置,以及如何在我的实际应用程序中使用它们

我将在扩展文件中有很多关键图像,因此还需要防止用户在下载所有内容之前玩游戏

最后,我还必须访问大量图像的基于密度的部分,以及少量原始文件(如视频),这是我目前必须解决的问题,即在扩展文件中打开哪个文件夹

String ExpansionFolder = "";
switch (getResources().getDisplayMetrics().densityDpi)
{
    case DisplayMetrics.DENSITY_MEDIUM:
        ExpansionFolder = "mdpi";
        break;
    case DisplayMetrics.DENSITY_HIGH:
        ExpansionFolder = "hdpi";
        break;
    default: // This cover XHDPI, XXHDPI, TVDPI
        ExpansionFolder = "xhdpi";
        break;
}

如果我能使用一些示例代码,我将不胜感激。

我没有示例代码,因为我自己没有使用过扩展文件,但您的问题的具体答案似乎可以在上找到

如何首先将扩展文件复制到用户无法访问的位置,以及如何在我的实际应用程序中使用它们

从Android开发者页面的扩展文件()的“存储位置”部分:

当Google Play将您的扩展文件下载到设备时,它会将其保存到系统的共享存储位置。为确保行为正确,不得删除、移动或重命名扩展文件。如果应用程序必须从Google Play本身执行下载,则必须将文件保存到完全相同的位置

扩展文件的特定位置为:

[共享存储]/Android/obb// [shared storage]是指向共享存储空间的路径,可从getExternalStorageDirectory()获得。 [package name]是应用程序的Java风格包名,可从getPackageName()获得。 对于每个应用程序,此目录中的扩展文件从不超过两个。一个是主扩展文件,另一个是补丁扩展文件(如有必要)。使用新的扩展文件更新应用程序时,会覆盖以前的版本

String ExpansionFolder = "";
switch (getResources().getDisplayMetrics().densityDpi)
{
    case DisplayMetrics.DENSITY_MEDIUM:
        ExpansionFolder = "mdpi";
        break;
    case DisplayMetrics.DENSITY_HIGH:
        ExpansionFolder = "hdpi";
        break;
    default: // This cover XHDPI, XXHDPI, TVDPI
        ExpansionFolder = "xhdpi";
        break;
}
如果必须解压缩扩展文件的内容,请不要随后删除.obb扩展文件,也不要将解压缩的数据保存在同一目录中。您应该将解包的文件保存在getExternalFilesDir()指定的目录中。。但是,如果可能,最好使用扩展文件格式,允许您直接从文件中读取数据,而不是要求您解压缩数据。例如,我们提供了一个名为APK扩展Zip库的库项目,它直接从Zip文件读取数据

注意:与APK文件不同,用户和其他应用程序可以读取保存在共享存储上的任何文件。

发件人:

getExternalFilesDir

返回主外部文件系统(位于Environment.getExternalStorageDirectory()上的某个位置)上的目录的绝对路径,应用程序可以将其拥有的持久性文件放在该目录中这些文件是应用程序的内部文件,通常不作为媒体显示给用户。


我将在扩展文件中有很多关键图像,因此还需要防止用户在下载所有内容之前玩游戏

从“下载扩展文件”部分:

在大多数情况下,Google Play会在安装或更新APK的同时将您的扩展文件下载并保存到设备中。这样,当应用程序第一次启动时,扩展文件就可用了。但是,在某些情况下,您的应用程序必须自行下载扩展文件,方法是通过Google Play的应用程序许可服务提供给您的URL请求扩展文件。

下载扩展文件所需的基本逻辑如下:

当应用程序启动时,在共享存储位置(Android/obb/[package name]/目录)上查找扩展文件

  • 如果扩展文件在那里,那么您已经设置好了,您的应用程序可以继续
  • 如果扩展文件不存在: A.使用Google Play的应用程序许可执行请求,以获取应用程序的扩展文件名、大小和URL。 B使用Google Play提供的URL下载扩展文件并保存扩展文件。您必须将文件保存到共享存储位置(Android/obb/[package name]/),并使用googleplay响应提供的确切文件名
  • 注意:GooglePlay为您的扩展文件提供的URL在每次下载时都是唯一的,并且每次下载后不久都会过期

    除了LVL之外,还需要一组代码通过HTTP连接下载扩展文件,并将其保存到设备共享存储上的正确位置。在将此过程构建到应用程序中时,应考虑以下几个问题:

    • 设备可能没有足够的空间容纳扩展文件,因此您应该在开始下载之前进行检查,并在空间不足时警告用户
    • 文件下载应在后台服务中进行,以避免阻止用户交互,并允许用户在下载完成时离开您的应用程序
    • 在请求和下载过程中可能会发生各种错误,您必须妥善处理这些错误
    • 网络连接在下载过程中可能会发生变化,因此您应该处理这些变化,如果中断,请尽可能继续下载
    • 当下载在后台进行时,您应该提供一个通知,指示下载进度,在下载完成时通知用户,并在选择时将用户带回应用程序
    为了简化这项工作,我们构建了Downloader库,它请求扩展文件URL