2013-08-09 9 views
7

Quindi ho copiato l'esempio del pacchetto di espansione per Android e l'ho eseguito basato su the guide provided by google. Ho funzionato correttamente memorizzando un file .obb locale, ma non riesco a farlo funzionare con il download del file .obb. Lo stato è cambiato in IDownloaderClient.STATE_COMPLETED ma nessun file lo si trova.File di espansione scaricato ma non presente

passaggi che ho passato:

  1. eseguire make campione (aggiornato con BASE64_PUBLIC_KEY, new package name, version number)
  2. testare con successo con file di .obb locale.
  3. Crea apk e carica su Play insieme al file di espansione.
  4. Installa apk firmato ed esegui app. < - qui si dice che il download è stato un successo ma senza dare alcun progresso durante il processo di download.

Si prega di aiutare a scaricare il file di espansione.

Modifica: Al punto 4 ora Download non riuscito perché non è stato possibile trovare le risorse.

Modifica 2: Quindi, dopo il debug, vedo che lo stato cambia in nessun download richiesto ma non riesce a convalidare il file in quanto mancante. Quindi per qualche motivo pensa che il file sia stato scaricato.

Edit 3: Così all'interno DownloaderService.class abbiamo un metodo run(), che fa un getExpansionURLCount() che restituisce 0. documentazione dice: this will return zero if there has been no LVL fetch in the current session. Dopo ulteriori ricerche, vedo che la risposta ricevuta da Google in processServerResponse() ha il codice di risposta 256 e nessuna chiave con FILE_URL. Quindi qual è la causa di questo?

+0

siete in grado di scaricare il file da sampleDownloaderActivity? –

+0

@TarunDroid è quello che sto usando, sono in grado di verificare il mio file locale ma non il download dal gioco – Warpzit

+0

Sono stato bloccato con lo stesso problema da giorni, come hai risolto questo? – Amanni

risposta

4

So che questa risposta non risolve il problema di fondo, ma ho pensato che questa spiegazione potrebbe aiutare altri come me che sono stati confusi dalle risposte dalla libreria downloader:

Il servizio di utilità di download (un po 'ONU intuitivamente) passare STATE_COMPLETED a onDownloadStateChanged() quando il server delle licenze di Google lo informa che non ci sono file di espansione associati all'app. Dal momento che deve effettuare una chiamata asincrona al server per scoprirlo, non può semplicemente restituire NO_DOWNLOAD_REQUIRED direttamente da startDownloadServiceIfRequired(). Deve avviare il servizio per consultare il server.

Ma sembra che lo farà solo la prima volta che si chiama il servizio di download dopo l'installazione dell'app, dopodiché memorizza nella cache la risposta dal server di licenze in un database locale e le chiamate future a startDownloadServiceIfRequired() verranno restituite immediatamente NO_DOWNLOAD_REQUIRED.

codice di risposta 256 corrisponde a Policy.LICENSED, il che significa il nome del pacchetto e la chiave pubblica sono validi, ma la mancanza di qualsiasi FILE_URL suggerisce che Google Play pensa che non ci alcun file di espansione per l'applicazione.

Nel mio caso, il mio file di espansione ha funzionato quando l'app era in bozza, ma una volta pubblicata, è effettivamente scomparsa dallo store. Non sono stato in grado di determinare il perché.

+1

heh ora il tuo caso sembra più anoing. Hai provato ha funzionato e poi ti sei fregato :) ma grazie per la spiegazione. – Warpzit

+1

Il problema è stato risolto caricando nuovamente l'APK (con un numero di versione incrementato) e quindi caricando nuovamente il file di espansione. È interessante notare che la console ha mostrato che non c'erano file di espansione esistenti, ma quando ho re-caricato, ha dato il numero di versione 2. La mia conclusione da tutto ciò è che la Console per gli sviluppatori di Google Play è bug quando si tratta di gestire i file di espansione. –

+0

Questa è stata la risoluzione per me.Ho visto lo stesso problema dell'OP con un'app che era stata precedentemente pubblicata senza OBB. Una versione successiva caricata con un OBB in beta ha restituito STATE_COMPLETE per circa due ore fino a quando i server di Google non sono stati aggiornati con la build. – zippycoder

1

Probabilmente perché il file è stato trovato "incompleto" quando si eseguono i controlli dopo il completamento e quindi è stato eliminato.

Una possibilità è che la lunghezza del file scaricato è diversa da quella fornita a android.vending/expansion/downloader.Helpers.deosFileExist(Context, String, long, boolean), quindi controllare prima per vedere il valore fornito corrisponde al valore effettivo.

Se ciò non risolve il problema, prendere in considerazione l'aggiunta di punto di interruzione a tutte le chiamate di eliminazione file e verificare se vengono attivate.

+0

Ma ha funzionato per quello locale, quindi perché il locale e il caricato sono di dimensioni diverse quando uso lo stesso file =/non ha senso – Warpzit

+0

Beh, è ​​o che il file non è stato scaricato nel primo luogo, che dalla tua descrizione non è probabile. Inoltre, non fa male controllare il file caricato per assicurarsi che il suo numero di versione/dimensione/contenuto corrisponda a quello di quello che hai localmente. – Kai

+0

Ofcourse, ho provato a ricaricare il file più volte con lo stesso risultato: un qualche tipo di errore. – Warpzit

1

Dopo alcuni giorni di ricerca con una soluzione, ho trovato l'errore nel mio caso.

Utilizzando LicenseChecker, ho visto l'ascoltatore callback un ApplicationError con il codice 3. Qui Codice:

 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); 
     } 

    }); 

codice di errore 3 è ERROR_NOT_MARKET_MANAGED, si può vedere l'elenco completo degli errori qui https://developer.android.com/google/play/licensing/licensing-reference.html#server-response-codes, e qui posso ottenere informazioni a tale proposito errore medio How do you deal with LicenseCheckerCallback.ERROR_NOT_MARKET_MANAGED error code?

sintesi, quello che è successo perché la mia versione locale non è la stessa versione su console google, e mi è successo perché la mia versionCode è generato da uno script come questo:

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() 
} 

Quindi ogni volta che compilo sto ottenendo una nuova versione e ovviamente quella versione non è su google console.

ho cambiato il mio script Gradle a:

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 
} 

E questo ha salvato la vita, spero che questa risposta può essere l'utilità a chiunque di più ..