8

所以我复制了 Android 的扩展包示例,并根据google 提供的指南使其运行。我已经通过存储本地 .obb 文件成功地使其工作,但我无法设法让它与下载 .obb 文件一起工作。状态更改为IDownloaderClient.STATE_COMPLETED但找不到文件。

我经历过的步骤:

  1. 运行示例(使用BASE64_PUBLIC_KEY, new package name,更新version number
  2. 使用本地 .obb 文件成功测试。
  3. 制作apk并与扩展文件一起上传到Play。
  4. 安装签名的 apk 并运行应用程序。<-- 这里表示下载成功,但在下载过程中没有提供任何进度更新。

请帮助下载扩展文件。

编辑:在第 4 步,我现在下载失败,因为找不到资源。

编辑2:所以调试后我看到状态更改为不需要下载,但由于文件丢失而无法验证文件。因此,出于某种原因,它认为该文件已被下载。

编辑 3:所以在 DownloaderService.class 我们有一个 run() 方法,它使 agetExpansionURLCount()返回 0。文档说:this will return zero if there has been no LVL fetch in the current session。经过更多挖掘后,我发现我从 Google 获得processServerResponse()的响应具有响应代码 256 并且没有带有FILE_URL. 那么这是什么原因呢?

4

3 回答 3

5

我知道这个答案并没有解决根本问题,但我认为这个解释可能会帮助像我这样对下载器库的响应感到困惑的其他人:

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

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

响应码 256 对应Policy.LICENSED,表示包名和公钥是有效的,但没有任何信息FILE_URL表明 Google Play 认为该应用没有扩展文件

在我的例子中,我的扩展文件在应用程序处于草稿状态时工作,但一旦发布,它实际上从商店中消失了。我无法确定原因。

于 2014-04-25T06:06:15.290 回答
1

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

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

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

于 2013-08-09T11:14:50.007 回答
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,在这里我可以获得有关该信息的信息error mean你如何处理 LicenseCheckerCallback.ERROR_NOT_MARKET_MANAGED 错误代码?

总结,这是因为我的本地版本与谷歌控制台上的版本不同,而发生在我身上是因为我的 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()
}

所以每次我编译时都会得到一个新版本,显然那个版本不在谷歌控制台上。

我将我的 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 
}

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

于 2015-10-18T03:34:19.550 回答