Comment puis-je mettre en place une licence Google Play pour une application Android?

J’ai vu les instructions de la bibliothèque de licences Android-Developer, mais la vue d’ensemble semble omettre plusieurs étapes clés du processus et ne parvient pas à expliquer complètement comment faire fonctionner quelque chose.

Quelqu’un peut-il fournir un ensemble explicite d’opérations permettant de configurer la bibliothèque de licences sur une application Android afin de vérifier qu’un utilisateur a acheté une application dans Google Play avant d’autoriser son utilisation?

Je travaille sur l’implémentation des licences dans mon application depuis un certain temps et je le finis par fonctionner. Je voulais partager certaines des choses que je trouvais utiles pour commencer et quelques problèmes et solutions que j’ai trouvés avec tout le monde. Le tutoriel de développement Android que j’ai lié ci-dessous est correct, mais ce n’était pas très utile pour moi, alors j’ai décidé de faire un tutoriel. Profitez-en et j’espère que cela vous aidera!

Lien vers la page développeur ici .

1. Commencer

Les choses dont vous aurez besoin

1.1 Votre clé d’application unique Base64

Comment l’obtenir:

une. Accédez à votre console de développeur. Lien.

b. Si vous n’avez pas encore créé de brouillon d’application pour votre application, faites-le maintenant.

c. Une fois que vous avez créé le brouillon, il est .apk de télécharger votre .apk tant .apk ou bêta. Laissez-le inédit.

ré. Cliquez sur Services & APIs

e. Faites défiler la liste et trouvez votre YOUR LICENSE KEY FOR THIS APPLICATION

F. Copiez la clé dans votre application comme ceci:

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

Assurez-vous qu’il n’y a pas d’espace.

1.2 Un sel

une. Qu’est-ce qu’un sel?

Un sel est une donnée aléatoire qui est une entrée supplémentaire lors du hachage d’un mot de passe. Ils sont utilisés pour se défendre contre les attaques par dictionnaire et les attaques par table arc-en-ciel .

b. Comment en obtenir un?

C’est un bon lien pour générer un sel aléatoire. Il devrait y avoir exactement 20 entiers aléatoires, donc mettez 20 in pour la quantité de chaînes aléatoires à générer, chaque chaîne doit comporter 2 caractères (utilisée pour cet exemple, elle ne doit pas nécessairement être). Vérifiez les chiffres et cochez les chaînes identiques. Ils peuvent aussi être des nombres négatifs. Essayez de supprimer toute redondance, par exemple 00 -> 0 , dans un souci de cohérence.

c. Où est-ce que je mets le sel?

Lorsque vous déclarez des variables, entrez simplement ce code, sauf avec votre sel aléatoire.

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

2. Importer la bibliothèque LVL (Licensing) dans Eclipse et le code dont vous avez besoin

2.1 Importer la bibliothèque

une. Ouvrez Android SDK Manager

b. Aller aux Extras

c. Installer la Google Play Licensing Library

ré. Recherchez le chemin d’installation du SDK répertorié en haut du gestionnaire du SDK.

e. Une fois que vous y êtes, accédez à: /extras/google/play_licensing

F. Dans eclipse, cliquez sur file puis import , puis Existing Android Code Into Workspace et lorsqu’il vous demande le chemin du fichier, accédez au dossier play_licensing et cliquez sur la library .

g. Une fois le projet nommé library importé, cliquez dessus avec le bouton droit de la souris, puis cliquez sur les properties . Cliquez sur Android à gauche et naviguez vers le bas et cochez Is Library , puis appuyez sur apply. Cela permet à eclipse de savoir que vous pouvez utiliser ce code de projet en tant que bibliothèque.

h. Faites un clic droit sur votre application à laquelle vous ajoutez des licences et cliquez sur Propriétés, puis cliquez sur Android . Allez en bas et cliquez sur la library et ajoutez-la au chemin de génération. Cela devrait importer la bibliothèque dans le dossier Android Dependencies .

je. Votre projet est configuré pour passer à l’étape suivante.

2.2 Variables à déclarer avec votre SALT et votre KEY

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

2.3 Le code

Collez ce code près du bas de votre application. Cette implémentation avertira l’utilisateur si la licence n’est pas valide et l’invite à acheter l’application ou à la quitter.

  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 Obtenir l’identifiant de votre appareil

Il y a eu un débat à ce sujet dans le passé sur l’utilisation ou non de la série sim ou de TelephonyManager.getDeviceId(); mais il est généralement recommandé d’utiliser le code suivant pour obtenir l’ ANDROID_ID de votre appareil pour une compatibilité maximale.

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

2.5 Création du vérificateur de licence

une. Avant d’appeler doCheck(); vous devez mettre ce code dans votre application pour vous assurer que tout est créé correctement.

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

Lorsque je faisais mon implémentation de LVL, j’ai lu que si vous rencontrez des problèmes avec la mChecker = new LicenseChecker(this... licences, vous pouvez changer le premier dans mChecker = new LicenseChecker(this... Au cas où.

2.6 Ajout d’permissions

une. Deux permissions doivent être ajoutées au fichier manifest de vos applications.

   

2.7 Assurez-vous d’avoir les importations appropriées!

Vous avez probablement déjà fait cela, mais j’ai pensé que ce serait un bon endroit pour vérifier.

2.8 Comment appeler la licence à vérifier

une. Il suffit d’appeler doCheck(); chaque fois que vous voulez vérifier la licence. Par exemple, si l’application est en cours d’exécution, effectuez la vérification.

3. Comment tester les licences pour vous assurer qu’elles fonctionnent avant de les publier?

3.1 Configuration du périphérique de test

une. J’ai mon téléphone personnel que j’utilise également pour les tests. Il est recommandé qu’il n’y ait qu’un seul compte Google enregistré sur le téléphone, ce qui facilite les choses. Vous pouvez vérifier les comptes en allant dans Settings -> Accounts .

3.2 Configuration de la console du développeur

une. Ouvrez votre console de développeur et accédez à Settings sur le côté gauche.

b. Rechercher un License Testing

c. Assurez-vous que votre adresse e-mail est répertoriée sous Gmail accounts with testing access

ré. Maintenant, vous pouvez changer la réponse du test à ce que vous voulez à des fins de test. L’application devrait répondre en conséquence. N’oubliez pas que si vous enregistrez les données via SharedPrefs, vous devrez effacer les données de votre application chaque fois que vous les testez. Assurez-vous que vous cliquez sur Enregistrer après avoir modifié la réponse du test ou que rien ne se passera! J’ai oublié cela à plusieurs resockets et je me suis retrouvé avec une migraine, puis j’ai vu ce bouton de sauvegarde puant. Lol.

4. Choses à essayer

4.1 Vérification de licence conditionnelle

une. Vous pouvez essayer ce code si vous enregistrez les données SharedPreferences dans SharedPreferences .

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

4.2 Cryptage de vos SharedPreferences aide de SecurePreferences

une. Allez sur ce lien .

b. Copiez et collez le code de SecurePreferences.java dans une classe portant exactement le même nom dans votre projet.

c. Lisez le ReadMe.md pour plus d’informations sur la mise en œuvre de cela.

5. Dépannage

La gestion des licences peut être un casse-tête à résoudre, simplement parce qu’il ya beaucoup d’autres choses qui peuvent mal tourner. Par exemple, il peut y avoir des problèmes de réseau ou des problèmes de serveur qui vous donnent envie de vous arracher les cheveux. L’utilisation de la journalisation appropriée aidera à cela, vous pouvez également obtenir les codes de réponse du serveur en cas de problème et vous pouvez le suivre sur le serveur ou votre application. J’ai dû le faire à plusieurs resockets.

5.1 Je n’arrive pas à récupérer mon application sur le serveur

Correctifs possibles:

une. Assurez-vous que votre application a la bonne KEY .

b. Assurez-vous que vous enregistrez chaque étape de la progression

c. Vérifiez votre journal pour tout ce qui concerne le service de licence. Cela peut être utile pour déterminer où quelque chose a mal tourné.

ré. Assurez-vous que allow() et dontAllow() et applicationError() ont des balises @Override .

5.2 Mon application dit toujours NOT_LICENSED ou NOT_LICENSED peu importe ce que je lui ai défini dans la réponse du test

une. Le meilleur remède que j’ai pour cela est d’attendre. Il semble que si vous faites beaucoup de tests dans un court laps de temps, il vous enverra toujours le code serveur 291 qui est le code de nouvelle tentative. J’ai attendu toute la nuit et tout s’est bien passé le lendemain matin.

b. Vous pouvez effacer les données (pas seulement le cache) de l’application Google Play et de l’application Google Play Services. Ensuite, ouvrez la sauvegarde et acceptez toutes les licences, puis réessayez.

c. Effacer les données de votre application.

5.3 Liste des codes de réponse du serveur pour le débogage

Vous devriez obtenir ces valeurs décimales pour int reason si vous les connectez. Utilisez ce tableau pour référencer ce que le serveur envoie réellement à votre application.

 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 Chambre pour plus! Ils viendront!

J’espère que cela vous aide les gars! J’ai essayé de partager mes maux de tête et les corrections avec vous, du mieux que je peux, et j’espère que cela vous aidera!

Si j’ai fait des erreurs, assurez-vous de m’en parler pour que je puisse les réparer dès que possible!