Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.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
Android 已下载扩展文件,但不在那里_Android_Apk Expansion Files - Fatal编程技术网

Android 已下载扩展文件,但不在那里

Android 已下载扩展文件,但不在那里,android,apk-expansion-files,Android,Apk Expansion Files,因此,我复制了Android的扩展包示例,并使其基于。通过存储本地.obb文件,我成功地使其工作,但我无法设法使其在下载.obb文件时工作。状态更改为IDownloaderClient。状态\u已完成,但找不到文件 我所经历的步骤: 运行示例(使用BASE64\u公钥更新,新程序包名称,版本号) 已成功使用本地.obb文件进行测试 制作apk并上传与扩展文件一起播放 安装已签名的apk并运行应用程序 这可能是因为在完成后进行检查时发现文件“不完整”,然后被删除 一种可能是下载文件的长度与您提供给

因此,我复制了Android的扩展包示例,并使其基于。通过存储本地.obb文件,我成功地使其工作,但我无法设法使其在下载.obb文件时工作。状态更改为
IDownloaderClient。状态\u已完成
,但找不到文件

我所经历的步骤:

  • 运行示例(使用
    BASE64\u公钥更新,
    新程序包名称
    版本号
  • 已成功使用本地.obb文件进行测试
  • 制作apk并上传与扩展文件一起播放

  • 安装已签名的apk并运行应用程序 这可能是因为在完成后进行检查时发现文件“不完整”,然后被删除

    一种可能是下载文件的长度与您提供给android.vending/expansion/downloader.Helpers.deosFileExist(上下文、字符串、长字符串、布尔值)
    的长度不同,因此首先检查提供的值是否与实际值匹配


    如果这不能解决这个问题,那么考虑将断点添加到所有文件删除调用中,看看是否有任何一个被触发。

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

    当谷歌授权服务器通知下载服务没有与应用程序相关的扩展文件时,下载服务将(有点不直观地)将
    STATE_COMPLETED
    传递给
    onDownloadStateChanged()
    。因为它必须对服务器进行异步调用才能找到这个问题,所以它不能直接从
    startDownloadServiceIfRequired()
    返回
    NO\u DOWNLOAD\u REQUIRED
    。它必须启动服务才能咨询服务器

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

    响应代码256对应于
    策略。许可
    ,这意味着软件包名称和公钥有效,但缺少任何
    文件\u URL
    表明Google Play认为应用程序没有扩展文件


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

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

    使用LicenseChecker,我看到侦听器回调一个applicationError,代码为3。此处代码:

            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是错误管理的,您可以在这里看到完整的错误列表,在这里我可以得到关于该错误的信息

    总结,这是因为我的本地版本与google console上的版本不同,而我的版本代码是由以下脚本生成的:

    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 
    }
    

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

    你能通过sampleDownloaderActivity下载文件吗?@TarunDroid这就是我正在使用的,我能验证我自己的本地文件,但不能从Play下载。我已经被同样的问题困扰了好几天了,你是如何解决的?@Amanni我没有。但我建议制作一个新的测试应用程序并发布它,然后尝试版本2添加扩展文件示例,看看是否有效。请报告这是怎么回事。@Dalinaum我最终用服务器解决了这个问题。google api确实可以工作,但使用起来非常令人沮丧;)但是我本来打算回去让它工作的。但是它对本地的工作有效,那么为什么本地和上传的文件在大小上会不同,当我使用同一个文件时=/没有意义。或者是这个文件没有下载,这从你的描述来看是不可能的。检查上传的文件以确保其版本号/大小/内容与本地文件的版本号/大小/内容相匹配也没有什么坏处。当然,我多次尝试重新上传该文件,结果都是一样的:出现了某种错误。呵呵,现在你的情况听起来更糟了。你已经测试过了,然后你被搞砸了:)但是谢谢你的解释。这个问题是通过重新上传APK(版本号增加)然后重新上传扩展文件解决的。有趣的是,控制台显示没有现有的扩展文件,但当我重新上传时,它给出了版本号2。我的结论是,Google Play开发者控制台在处理扩展文件时存在缺陷。这是我的解决方案。我看到了与OP相同的问题,之前发布的应用程序没有OBB。一个更新的版本上传了一个OBB到beta版,返回状态_完成约两个小时,直到谷歌服务器更新版本。