2013-08-20 20 views
37

Ho visto la libreria di licenze per Android-Developer instructions, ma la panoramica sembra omettere diversi passaggi chiave del processo e non riesce a spiegare completamente come ottenere un risultato positivo.Come posso implementare Google Play Licensing per un'app per Android?

Qualcuno può fornire un insieme esplicito di operazioni che ha funzionato per impostare la libreria di licenze su un'app Android in modo da verificare che un utente abbia pagato un'app in Google Play prima di consentirne l'utilizzo?

+1

Forse dovresti mettere la domanda attuale qui (ad es. "Ci sono buone esercitazioni su licenza Android?") E aggiungere il tuo tutorial come risposta? – ozbek

+0

@shoerat Ci ho pensato, suppongo che avrei potuto rispondere alla mia domanda, ma sembrerebbe un po 'goffo quando qualcuno lo legge. –

+0

Hmm ... Resto in disaccordo :) Ora, il modo in cui si erge, non c'è modo per nessun'altra persona di inserire alcun input qui. 1) È possibile rispondere alle proprie domande qui. 2) È possibile aggiungere "Nessun collegamento fuori sito, per favore". 3) Se sei davvero preoccupato, puoi scegliere di rendere la tua risposta un ** wiki della comunità **. In modo che non assomigli a un grido per i punteggi di reputazione. – ozbek

risposta

134

Ho lavorato per implementare le licenze nella mia app per un po 'di tempo e finalmente ho funzionato. Volevo condividere alcune delle cose che ho trovato utili per iniziare e alcuni problemi e soluzioni che ho trovato con tutti. Il tutorial per Android Dev che ho collegato sotto è ok, ma non è stato molto utile per me, così ho deciso di fare un tutorial. Divertiti, e spero che ti aiuti!

Collegamento alla pagina sviluppatore here.

1. Introduzione

cose che hai bisogno.

1.1 L'applicazione unica Base64 chiave

come ottenerlo:

a. Vai alla tua console degli sviluppatori. Link.

b. Se non hai già creato una bozza di applicazione per la tua app, fallo ora.

c. Una volta creata la bozza, è consigliabile caricare il tuo .apk come Alpha o Beta. Lascia inedito.

d. Click Services & APIs

e. Scorri verso il basso e trova YOUR LICENSE KEY FOR THIS APPLICATION

f. Copia la chiave nella tua app in questo modo:

private static final String BASE64_PUBLIC_KEY = "YOUR LICENSE KEY FOR THIS APPLICATION"; 

Assicurarsi che non ci siano spazi.

1,2 Un sale

a. Cos'è un sale?

A salt è un dato casuale che è un input aggiuntivo quando si esegue l'hashing di una password. Sono usati per difendersi dagli attacchi dictionary attacks e rainbow table.

b. Come ottengo uno?

This è un buon collegamento per generare un salt casuale. Ci dovrebbe essere esattamente 20 numeri interi casuali, quindi inserire 20 in per la quantità di stringhe casuali da generare, ogni stringa deve essere lunga 2 caratteri (utilizzata per questo esempio, non deve essere). Controllare le cifre numeriche e verificare che le stringhe identiche siano consentite. Possono essere anche numeri negativi. Prova a rimuovere qualsiasi ridondanza, ad es. 00 -> 0, per motivi di coerenza.

c. Dove metto il sale?

Quando si dichiarano le variabili, inserire questo codice, ad eccezione del sale casuale.

private static final byte[] SALT = new byte[] {YOUR RANDOM SALT, COMMA SEPARATED, 20 INTEGERS}; 

2. Importazione biblioteca LVL (licenze) in Eclipse e il codice necessario

2,1 Importazione biblioteca

a. Aperto Android SDK Manager

b. Vai a Extras

c. Installa Google Play Licensing Library

d. Trova il tuo percorso di installazione SDK che è elencato nella parte superiore del gestore SDK.

e. Una volta lì, vai a: <sdk>/extras/google/play_licensing

f. In eclissi, fare clic su file quindi import, quindi su Existing Android Code Into Workspace e quando viene richiesto il percorso del file, accedere alla cartella play_licensing e fare clic su library.

g. Dopo aver importato il progetto library, fare clic con il pulsante destro del mouse, quindi premere properties. Fai clic su Android a sinistra e vai in fondo e controlla Is Library, quindi premi applica. Ciò consente a eclipse di sapere che è possibile utilizzare questo codice di progetto come libreria.

h. Fai clic con il pulsante destro del mouse sull'app a cui aggiungi la licenza e fai clic su Proprietà, quindi premi Android. Vai in fondo e fai clic su library e aggiungilo al percorso di generazione. Questo dovrebbe importare la libreria nella cartella Android Dependencies.

i. Il tuo progetto è impostato per andare al passaggio successivo.

2.2 Variabili di dichiarare insieme al tuo SALT e KEY

private Handler mHandler; 
private LicenseChecker mChecker; 
private LicenseCheckerCallback mLicenseCheckerCallback; 
boolean licensed; 
boolean checkingLicense; 
boolean didCheck; 

2,3 Il codice

Incolla questo codice nella parte inferiore della vostra applicazione. Questa implementazione avviserà l'utente se la licenza non è valida e chiederà loro di acquistare l'app o di uscirne.

private void doCheck() { 

     didCheck = false; 
     checkingLicense = true; 
     setProgressBarIndeterminateVisibility(true); 

     mChecker.checkAccess(mLicenseCheckerCallback); 
    } 


    private class MyLicenseCheckerCallback implements LicenseCheckerCallback { 

     @Override 
     public void allow(int reason) { 
      // TODO Auto-generated method stub 
      if (isFinishing()) { 
       // Don't update UI if Activity is finishing. 
       return; 
      }    
      Log.i("License","Accepted!");  

       //You can do other things here, like saving the licensed status to a 
       //SharedPreference so the app only has to check the license once. 

      licensed = true; 
      checkingLicense = false; 
      didCheck = true; 

     } 

     @SuppressWarnings("deprecation") 
     @Override 
     public void dontAllow(int reason) { 
      // TODO Auto-generated method stub 
      if (isFinishing()) { 
        // Don't update UI if Activity is finishing. 
        return; 
       } 
       Log.i("License","Denied!"); 
       Log.i("License","Reason for denial: "+reason);                    

         //You can do other things here, like saving the licensed status to a 
         //SharedPreference so the app only has to check the license once. 

       licensed = false; 
       checkingLicense = false; 
       didCheck = true;    

       showDialog(0); 

     } 

     @SuppressWarnings("deprecation") 
     @Override 
     public void applicationError(int reason) { 
      // TODO Auto-generated method stub 
      Log.i("License", "Error: " + reason); 
      if (isFinishing()) { 
       // Don't update UI if Activity is finishing. 
       return; 
      } 
      licensed = true; 
      checkingLicense = false; 
      didCheck = false; 

      showDialog(0); 
     } 


    } 

    protected Dialog onCreateDialog(int id) { 
     // We have only one dialog. 
     return new AlertDialog.Builder(this) 
       .setTitle("UNLICENSED APPLICATION DIALOG TITLE") 
       .setMessage("This application is not licensed, please buy it from the play store.") 
       .setPositiveButton("Buy", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int which) { 
         Intent marketIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(
           "http://market.android.com/details?id=" + getPackageName())); 
         startActivity(marketIntent); 
         finish(); 
        } 
       }) 
       .setNegativeButton("Exit", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int which) { 
         finish(); 
        } 
       }) 
       .setNeutralButton("Re-Check", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int which) { 
         doCheck(); 
        } 
       }) 

       .setCancelable(false) 
       .setOnKeyListener(new DialogInterface.OnKeyListener(){ 
        public boolean onKey(DialogInterface dialogInterface, int i, KeyEvent keyEvent) { 
         Log.i("License", "Key Listener"); 
         finish(); 
         return true; 
        } 
       }) 
       .create(); 

    } 

2,4 Ottenere il vostro dispositivo id

C'è stata qualche discussione su questo in passato circa se utilizzare o meno la serie sim o TelephonyManager.getDeviceId(); ma In generale si consiglia di utilizzare il seguente codice per ottenere il ANDROID_ID del dispositivo per la massima compatibilità.

String deviceId = Secure.getString(getContentResolver(), Secure.ANDROID_ID); 
Log.i("Device Id", deviceId); //AN EXAMPLE OF LOGGING THAT YOU SHOULD BE DOING :) 

2,5 Creazione del correttore licenza

a. Prima di chiamare doCheck(); devi inserire questo codice nella tua app per assicurarti che tutto venga creato correttamente.

mHandler = new Handler(); 
mLicenseCheckerCallback = new MyLicenseCheckerCallback(); 
mChecker = new LicenseChecker(this, new ServerManagedPolicy(this, new AESObfuscator(SALT, getPackageName(), deviceId)), BASE64_PUBLIC_KEY); 

Quando stavo facendo il mio Implementazione di LVL, ho letto che se si hanno problemi con licenza, è possibile modificare la prima this nella mChecker = new LicenseChecker(this...-getApplicationContext(), il mio sembrava funzionare senza di essa, ma solo nel caso .

2.6 si aggiungono le autorizzazioni

a. Sono disponibili due autorizzazioni che è necessario aggiungere al file manifest delle applicazioni.

<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="com.android.vending.CHECK_LICENSE"/>   

2.7 Assicurarsi di disporre delle importazioni corrette!

Probabilmente lo avete già fatto, ma ho pensato che sarebbe stato un buon posto per voi per controllare.

2.8 Come chiamare la licenza da controllare

a. Basta chiamare lo doCheck(); ogni volta che si desidera controllare la licenza. Ad esempio, se l'app è alla sua prima esecuzione, effettua il controllo.

3. Come si esegue il test della licenza per assicurarsi che funzioni prima di pubblicarla?

3,1 Configurazione dispositivo di prova

a. Ho il mio telefono personale che uso anche per i test. Si consiglia di registrare un solo account Google sul telefono, storicamente rende le cose un po 'più semplici. È possibile controllare i conti andando a Settings -> Accounts.

3,2 Configurazione della console sviluppatore

a. Apri la console per gli sviluppatori e vai a Settings sul lato sinistro.

b. Trova License Testing

c. Assicurati che il tuo indirizzo email sia elencato sotto Gmail accounts with testing access

d. Ora puoi cambiare la risposta del test a ciò che vuoi a scopo di test. L'app dovrebbe rispondere di conseguenza. Ricorda che se si salvano i dati tramite SharedPrefs, è necessario cancellare i dati dell'app ogni volta che si esegue il test. Assicurati di fare clic su Salva dopo aver modificato la risposta di prova o non accadrà nulla! Mi sono dimenticato più volte e ho finito con un'emicrania, poi ho visto quel pulsante di salvataggio puzzolente. Lol.

4.Cose da provare

4,1 licenza condizionale verifica

a. È possibile provare questo codice se si salvano i dati didCheck in SharedPreferences.

if(didCheck==false){ 
     Toast.makeText(this, "Checking application license...",  Toast.LENGTH_SHORT).show(); 
     doCheck(); 
     Log.i("Checking!", "Checking license!"); 
    } 

4,2 Crittografia SharedPreferences utilizzando SecurePreferences

a. Vai a questo link.

b. Copia e incolla il codice da SecurePreferences.java in una classe con lo stesso nome nel tuo progetto.

c. Leggi lo ReadMe.md per informazioni sull'implementazione di questo.

5. Risoluzione dei problemi

licenza può essere un diavolo di un mal di testa per risolvere i problemi, semplicemente perché ci sono molte altre cose che possono andare storte. Ad esempio, potrebbero esserci problemi di rete o problemi del server che ti fanno venir voglia di strapparti i capelli. L'uso di una registrazione appropriata aiuterà con questo, è anche possibile ottenere i codici di risposta del server se c'è un problema e si può rintracciare il server o la tua app. Ho dovuto farlo in più occasioni.

5.1 Non riesco a ottenere la mia app per restituire nulla dal server

correzioni possibili:

a. Assicurati che l'app abbia il codice corretto KEY.

b. Assicurati di registrare ogni passo dei progressi

c. Controlla il tuo registro per qualsiasi cosa dal servizio di licenza. Può essere utile per capire dove qualcosa è andato storto.

d. Assicurati che allow() e dontAllow() e applicationError() abbiano tag @Override.

5.2 La mia app dice sempre LICENSED o NOT_LICENSED non importa quello che ho impostato per la risposta di prova

a. La migliore cura che ho per questo è solo aspettare. Sembra che se esegui molti test in un breve periodo di tempo, ti invierà sempre il codice del server 291, che è il numero di tentativi. Ho aspettato una notte e tutto ha funzionato bene la mattina successiva.

b. Puoi cancellare i dati (non solo la cache) dell'app Google Play e l'app Google Play Services. Quindi apri il backup e accetta tutte le licenze e riprova.

c. Cancella i dati dell'app.

5.3 Elenco dei codici di risposta del server per il debug

È necessario ottenere questi valori decimali per int reason se si registrano. Utilizza questa tabella per fare riferimento a ciò che il server sta effettivamente inviando alla tua app.

LICENSED = Hex: 0x0100, Decimal: 256 
NOT_LICENSED = Hex: 0x0231, Decimal: 561 
RETRY = Hex: 0x0123, Decimal: 291 
LICENSED_OLD_KEY = Hex: 0x2, Decimal: 2 
ERROR_NOT_MARKET_MANAGED = Hex: 0x3, Decimal: 3 
ERROR_SERVER_FAILURE = Hex: 0x4, Decimal: 4 
ERROR_OVER_QUOTA = Hex: 0x5, Decimal: 5 
ERROR_CONTACTING_SERVER = Hex: 0x101, Decimal: 257 
ERROR_INVALID_PACKAGE_NAME = Hex: 0x102, Decimal: 258 
ERROR_NON_MATCHING_UID = Hex: 0x103, Decimal: 259 

5.4 Spazio per più! Arriveranno!

Spero che questo ti aiuti ragazzi! Ho provato a condividere i miei mal di testa e ripara con voi ragazzi come meglio posso e spero che questo aiuti!

Se ho commesso errori, assicuratevi di parlarmi di loro in modo che io possa risolverli il prima possibile!

+11

ottimo lavoro e impegno .. lo apprezzo. Mantenere il buon lavoro. –

+0

Molto utile - Ho modificato per formare una domanda, forse verrà riaperta. Grazie per lo sforzo. – SQLiteNoob

+2

grande spiegazione, una cosa importante però, '' non è richiesto. È importante dire che la tua app non ha bisogno di internet diretto per verificare la licenza. – SagiLow

Problemi correlati