2013-08-09 3 views
7

Итак, я скопировал образец пакета расширения для Android и запустил его на основе the guide provided by google. Я успешно сделал это, сохранив локальный файл .obb, но мне не удается заставить его работать с загрузкой файла .bob. Состояние изменено на IDownloaderClient.STATE_COMPLETED, но файл не найден.Файл расширения загружен, но не там

шаги я через:

  1. сделать образец запуска (обновлено с BASE64_PUBLIC_KEY, new package name, version number)
  2. Успешно проверить с локальным файлом .obb.
  3. Сделать apk и загрузить, чтобы играть вместе с файлом расширения.
  4. Установить подписанное приложение apk и запустить. < - здесь говорится, что загрузка прошла успешно, но без каких-либо обновлений прогресса во время процесса загрузки.

Пожалуйста, помогите загрузить файл расширения.

Редактировать: На шаге 4 Теперь я получил Ошибка загрузки, потому что resouces не удалось найти.

Редактирование 2: Итак, после отладки я вижу, что статус изменяется без необходимости загрузки, но он не может проверить файл по мере его отсутствия. Поэтому по какой-то причине он считает, что файл был загружен.

Edit 3: Так внутри DownloaderService.class у нас есть метод Run(), который делает getExpansionURLCount(), которая возвращает 0. Документация говорит: this will return zero if there has been no LVL fetch in the current session. После большего копания я вижу, что ответ, который я получаю от Google в processServerResponse(), имеет код ответа 256 и никаких ключей с FILE_URL. Так в чем причина этого?

+0

Вы сможете скачать файл по sampleDownloaderActivity? –

+0

@TarunDroid это то, что я использую, я могу проверить свой собственный локальный файл, но не скачать с игры – Warpzit

+0

Я застрял с той же проблемой в течение нескольких дней, как вы это исправили? – Amanni

ответ

4

Я знаю, что этот ответ не решает основную проблему, но я думал, что это объяснение может помочь другим, как я, которые сбивают с толку ответами из библиотеки загрузчика:

Загрузчик служба будет (несколько не- интуитивно) передать STATE_COMPLETED в onDownloadStateChanged(), когда сервер лицензирования Google сообщит, что нет файлов расширения, связанных с приложением. Поскольку он должен сделать асинхронный вызов на сервере, чтобы узнать это, он не может просто вернуть NO_DOWNLOAD_REQUIRED непосредственно с startDownloadServiceIfRequired(). Он должен запустить службу, чтобы проконсультироваться с сервером.

Но похоже, что это будет сделано только при первом вызове службы загрузки после установки вашего приложения - после этого он кэширует ответ с сервера лицензирования в локальной базе данных, а будущие звонки на startDownloadServiceIfRequired() немедленно возвращаются NO_DOWNLOAD_REQUIRED.

Код ответа 256 соответствует Policy.LICENSED, что означает имя пакета и открытый ключ действительны, но отсутствие какого-либо FILE_URL предполагает, что Google Play думает, что нет файла расширения для приложения.

В моем случае файл расширения работал, когда приложение находилось в черновике, но после его публикации оно фактически исчезло из магазина. Я не смог определить, почему.

+1

Хе-хе теперь ваше дело звучит более анонимно. Вы протестировали его, а затем вы ввернули :), но спасибо за объяснение. – Warpzit

+1

Проблема была устранена путем повторной загрузки APK (с добавленным номером версии), а затем повторной загрузки файла расширения. Интересно, что консоль показала, что не было существующих файлов расширения, но когда я был повторно загружен, он дал ей версию номер 2. Мой вывод из всего этого заключается в том, что консоль разработчика Google Play не работает, когда дело касается обработки файлов расширений. –

+0

Это была резолюция для меня.Я видел ту же проблему, что и OP с приложением, которое ранее было опубликовано без OBB. Более поздняя версия, загруженная с OBB на бета-версию, возвращала STATE_COMPLETE около двух часов, пока серверы Google не обновились в сборке. – zippycoder

1

Возможно, это связано с тем, что файл был найден «неполным» при выполнении проверок после завершения и затем был удален.

Одна из возможностей - длина загруженного файла отличается от того, который вы предоставили android.vending/expansion/downloader.Helpers.deosFileExist(Context, String, long, boolean), поэтому сначала проверьте, чтобы предоставленное значение соответствовало фактическому значению.

Если это не решит проблему, рассмотрите возможность добавления точки останова для всех вызовов удаления файлов и выяснения, вызвана ли какая-либо из них.

+0

Но он работал на локальном, так почему бы локальный и загруженный быть разными по размеру, когда я использую тот же файл =/не имеет смысла – Warpzit

+0

Ну, это либо тот или иной файл не был загружен в первый место, которое из вашего описания маловероятно. Также не мешает проверять загруженный файл, чтобы убедиться, что его номер версии/размер/содержимое соответствует тому, что у вас есть локально. – Kai

+0

Конечно, я попытался повторно загрузить файл несколько раз с тем же результатом: некоторая ошибка. – Warpzit

1

После нескольких дней поиска по решению, я нашел ошибку для своего дела.

Использование 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 ERROR_NOT_MARKET_MANAGED, вы можете увидеть полный список ошибок здесь https://developer.android.com/google/play/licensing/licensing-reference.html#server-response-codes, и здесь я могу получить информацию о том, что ошибка означает, How do you deal with LicenseCheckerCallback.ERROR_NOT_MARKET_MANAGED error code?

Резюме, что случилось, потому что моя локальная версия не совпадает с версией на 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.

Я изменил свой 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 
} 

И это спасло мою жизнь, я надеюсь, что этот ответ может быть полезность для тех, кто еще ..