代码之家  ›  专栏  ›  技术社区  ›  Thomas Calc

已删除的APK扩展文件仍显示NO_DOWNLOAD_REQUIRED

  •  2
  • Thomas Calc  · 技术社区  · 12 年前

    [更新]

    我卸载了应用程序,然后在测试设备上再次安装,它开始正常工作。


    我正在实现APK扩展文件支持(但没有XAPK ZIP库支持)。

    文档暗示,如果缺少所需的APK扩展文件(例如,它从obb文件夹中删除),我的应用程序将重新下载它;我的应用程序一直在说NO_DOWNLOAD_REQUIRED。似乎Google Play Downloader Library从其SQLite数据库中获取的下载信息为空。注意,我还没有在Google Play上更新APK和扩展文件草稿,它们仍然是第一个版本。此外,上传到Google Play的APK版本代码也与测试设备上的版本代码相同。

    详细信息:

    1. 在正确的文件夹(obb)中有一个APK扩展文件。在我真正开始实现下载器功能之前,我将其用于测试目的。
    2. 当Downloader实现(基于Google Play Downloader Library)完成时,我更改了上述obb文件的大小,使其对我的应用程序无效。因此,这使得我的应用程序调用startDownloadIfNeedd()方法。
    3. 首先,我在Google Play上运行了我的实现,但没有任何文件。正如我预期的那样,结果是:“下载失败,因为找不到资源”
    4. 然后我将我的40MB APK和一个4MB扩展文件上传到Google Play(用于测试)。请注意,这个4 MB的扩展文件不是留在obb文件夹中的无效文件。当我运行我的实现时,1.5秒后出现了响应:“下载完成”。
    5. 这很奇怪,因为我的互联网连接不太快,无法下载4MB。实际上,obb文件夹(APK扩展文件的文件夹)仍然包含我最初手动放置的无效扩展文件。也就是说,没有下载任何内容!
    6. 我删除了无效文件,即obb文件夹现在是空的,但仍然没有开始下载,下载程序库显示no_download_REQUIRED。(我检查了它的内部实现:当它查询SQLite数据库以获取下载信息时,在查询后它将变为空。)

    我刚刚在某个地方读到,上传到Google Play的APK扩展文件需要几个小时才能生效。在我的例子中,我在上传后立即测试了我的实现。但它一定注意到Google Play上有文件,因为它给出了不同的信息(“下载完成”),而不是“找不到资源”。太糟糕了,它实际上没有下载任何东西;从那时起,它甚至不尝试(它一直返回NO_DOWNLOAD_REQUIRED)。

    我错过了什么?

    如果APK扩展文件被删除,下载程序库不应该注意吗?它的实现似乎可以解决这个问题,但前提是SQLite数据库查询对可下载文件返回非空值。

    Google Play Downloader Library内部实现的相关部分(最后一条评论是我的):

        int status = NO_DOWNLOAD_REQUIRED;
    
        // the database automatically reads the metadata for version code
        // and download status when the instance is created
        DownloadsDB db = DownloadsDB.getDB(context);
    
        // we need to update the LVL check and get a successful status to
        // proceed
        if (isLVLCheckRequired(db, pi)) {
            status = LVL_CHECK_REQUIRED;
        }
        // we don't have to update LVL. do we still have a download to start?
        if (db.mStatus == 0) {
            DownloadInfo[] infos = db.getDownloads();
            if (null != infos) {
                for (DownloadInfo info : infos) {
                    if (!Helpers.doesFileExist(context, info.mFileName, info.mTotalBytes, true)) {
                        status = DOWNLOAD_REQUIRED;
                        db.updateStatus(-1);
                        break;
                    }
                }
            }            
            /// <----- This is when infos==null, in this case result will be NO_DOWNLOAD_REQUIRED
    
        } else {
            status = DOWNLOAD_REQUIRED;
        }
    
    1 回复  |  直到 12 年前
        1
  •  0
  •   Thomas Calc    12 年前

    如果遇到同样的问题,请卸载应用程序,然后再次安装。(不要让Eclipse以通常的方式重新安装它。手动将其从设备上完全卸载。)