已下载扩展文件但不存在

时间:2013-08-09 10:32:12

标签: android apk-expansion-files

所以我复制了Android的扩展包示例并使其基于the guide provided by google运行。我已成功通过存储本地.obb文件使其工作,但我无法让它与下载.obb文件一起工作。状态更改为IDownloaderClient.STATE_COMPLETED但没有找到文件。

我经历过的步骤:

  1. 运行示例(使用BASE64_PUBLIC_KEY更新,new package nameversion number
  2. 使用本地.obb文件成功测试。
  3. 制作apk并上传到与扩展文件一起播放。
  4. 安装已签名的apk并运行应用。 < - 这里说下载很成功,但在下载过程中没有给出任何进展更新。
  5. 请帮助您下载扩展文件。

    修改:在第4步,我现在因为无法找到资源而导致下载失败。

    编辑2:因此,在调试后,我发现状态更改为无需下载,但无法验证文件,因为它已丢失。因此,出于某种原因,它认为该文件已被下载。

    编辑3:因此,在DownloaderService.class中,我们有一个run()方法,它使getExpansionURLCount()返回0.文档说:this will return zero if there has been no LVL fetch in the current session。在进行了更多挖掘后,我发现我在processServerResponse()中从Google获得的响应的响应代码为256,而没有FILE_URL的密钥。那么原因是什么?

3 个答案:

答案 0 :(得分:4)

我知道这个答案没有解决潜在的问题,但我认为这个解释可能会帮助像我一样被下载程序库的响应搞糊涂的其他人:

当Google许可服务器通知它没有与该应用关联的扩展文件时,下载程序服务(有点不直观地)将STATE_COMPLETED传递给onDownloadStateChanged()。由于它必须对服务器进行异步调用才能找到它,因此它不能直接从NO_DOWNLOAD_REQUIRED返回startDownloadServiceIfRequired()。它必须启动服务以咨询服务器。

但它似乎只会在您安装应用程序后第一次调用下载服务时执行此操作 - 之后,它会将许可服务器的响应缓存在本地数据库中,以及将来调用startDownloadServiceIfRequired()将立即返回NO_DOWNLOAD_REQUIRED

响应代码256对应Policy.LICENSED,意味着包名称和公钥有效,但缺少任何FILE_URL表明Google Play认为不是扩展文件为应用程序。

在我的情况下,我的扩展文件在应用程序处于草稿时起作用,但一旦发布,它就会从商店中消失。我无法确定原因。

答案 1 :(得分:1)

这可能是因为在完成检查后发现文件“不完整”,然后被删除。

一种可能性是下载文件的长度与您提供给android.vending/expansion/downloader.Helpers.deosFileExist(Context, String, long, boolean)的文件的长度不同,因此请首先检查提供的值是否与实际值匹配。

如果这不能解决问题,请考虑在所有文件删除调用中添加断点,并查看是否有任何触发。

答案 2 :(得分:1)

经过几天的解决方案搜索后,我发现了我的错误。

使用LicenseChecker,我看到监听器回调是一个带有代码3的applicationError。代码:

        aep = new APKExpansionPolicy(this,
            new AESObfuscator(ContentDownloaderService.SALT, getPackageName(), deviceId));

        aep.resetPolicy();    

        checker = new LicenseChecker(this, aep,
            BASE64_PUBLIC_KEY // Your public licensing key.
        );

        checker.checkAccess(new LicenseCheckerCallback() {
        @Override
        public void allow(int reason) {
            System.out.println("Allow Reason "+reason);
        }

        @Override
        public void dontAllow(int reason) {
            System.out.println("Don't Allow Reason "+reason);
            try {
                switch (reason) {
                    case Policy.NOT_LICENSED:
                        System.out.println("Not licensed");
                        break;
                    case Policy.RETRY:
                        System.out.println("Retry");
                        break;
                }
            } finally {
            }

        }

        @Override
        public void applicationError(int errorCode) {
            System.out.println("aplication error "+errorCode);
        }

    });

错误代码3是ERROR_NOT_MARKET_MANAGED,您可以在此处查看完整的错误列表https://developer.android.com/google/play/licensing/licensing-reference.html#server-response-codes,在这里我可以获得有关该错误的信息[{3}}

总结,发生这种情况是因为我的本地版本与Google控制台上的版本不同,并且发生在我身上,因为我的versionCode是由这样的脚本生成的:

def getBuildVersionCode() {
   def date = new Date()
   def formattedDate = date.format('yyMMddHHmm')

   return (formattedDate as int) + 221066279;    
}

def getBuildVersionName() {
return getBuildVersionCode().toString();
}

android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig {
    applicationId "com.test.testing"
    minSdkVersion 15
    targetSdkVersion 21
    versionCode getBuildVersionCode()
    versionName getBuildVersionName()
}

所以每次比我编译我都会得到一个新版本,显然那个版本不在google console上。

我将我的gradle脚本更改为:

    android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig {
    applicationId "com.test.testing"
    minSdkVersion 15
    targetSdkVersion 21
    versionCode 1731227595 // My actual version number of apk in google developer console.
    versionName 1731227595 
}

这节省了我的生命,我希望这个答案对任何人都有用..