IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Questions à propos de LicenceChecker


Sujet :

Android

  1. #1
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 604
    Points : 18 520
    Points
    18 520
    Par défaut Questions à propos de LicenceChecker
    Bonjour,

    J'ignore ce que c'est, mais il faut que je l'implémente dans mes projets.
    Bon apparemment c'est un système qui permet de vérifier que l'utilisateur à bien acheter son application.

    J'ai importé :
    android-sdks\extras\google\play_licensing\library
    android-sdks\extras\google\play_licensing\sample

    library est une librairie.
    sample utilise cette librairie..

    J'ai remplacé la valeur de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private static final String BASE64_PUBLIC_KEY
    Par ma clé.
    Apparemment le téléphone que j'utilise correspond à l'adresse eMail qu'il faut.

    Quand je clique sur Check licence j'ai : Application error: 3.

    Avec Licence Test Response = Respond normally, mais si je met n'importe quoi d'autre ça répond pareil.

    J'ai essayé de mettre ça dans mon projet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private static final String BASE64_PUBLIC_KEY = "";
    private LicenseCheckerCallback mLicenseCheckerCallback;
    private LicenseChecker mChecker;
    private static final byte[] SALT = new byte[] {-46, 65, 30, -128, -103, -57, 74, -64, 51, 88, -95, -45, 77, -117, -36, -113, -11, 31, -64, 89};
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    mLicenseCheckerCallback = new MyLicenseCheckerCallback();
     
    String deviceId = Secure.getString(getContentResolver(), Secure.ANDROID_ID);
     
    mChecker = new LicenseChecker(
         this, new ServerManagedPolicy(this,
              new AESObfuscator(SALT, getPackageName(), deviceId)),
         BASE64_PUBLIC_KEY);
     
    mChecker.checkAccess(mLicenseCheckerCallback);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    private class MyLicenseCheckerCallback implements LicenseCheckerCallback {
         public void allow(int policyReason) {
              if (isFinishing()) {
                   return;
              }
              Log.v("MyLicenceCheckerCallback", "Should allow user access : "+policyReason);
         }
     
         public void dontAllow(int policyReason) {
              if (isFinishing()) {
                   return;
              }
              Log.v("MyLicenceCheckerCallback", "Should not allow user access : "+policyReason);
         }
     
         public void applicationError(int errorCode) {
              if (isFinishing()) {
                   return;
              }
              Log.v("MyLicenceCheckerCallback", "The developer made a mistake : "+errorCode);
         }
    }
    Et là c'est pareil, j'ai The developer made a mistake : 3.

    Est-ce que vous savez ce que l'erreur 3 signifie ?
    Si vous avez des infos sur la vérification de licence.
    La doc est bien documenté, voir trop peut être, c'est trop beaucoup trop long.

    Merci.
    Keith Flint 1969 - 2019

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Points : 968
    Points
    968
    Par défaut
    Hehe, moi je m'y suis plongé pendant plusieurs heures il y a quelques mois.
    En fait, je crois que tu as oublié une étape importante.

    Si mes souvenirs sont bons, il faut avoir mis ton application (avec son propre package name) en tant que draft dans ton espace de publication https://market.android.com/publish/Home

  3. #3
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 604
    Points : 18 520
    Points
    18 520
    Par défaut
    Merci pour votre réponse.

    J'ai uploadé mon APK sur Google Play, là il est en tant que brouillon.

    J'ai toujours l'erreur 3.
    Est-ce que je peux modifier mon projet, l'envoyer sur mon téléphone et que ça fonctionne ?

    L'erreur 3 c'est :
    LicenseCheckerCallback.ERROR_NOT_MARKET_MANAGED
    Apparemment.

    Donc vous avez raison.
    Cela dit ce n'est pas la seule j'ose que j'ai oublié de faire...

    Edit :
    Au lieu de passer par Eclipse, j'ai pris l'APK que j'ai envoyé sur Google Play et j'ai toujours l'erreur 3.
    Keith Flint 1969 - 2019

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Points : 968
    Points
    968
    Par défaut
    Ce qu'il faut faire c'est signer l'application depuis eclipse :
    Clic-droit -> Android Tools -> export signed APK.
    Ensuite, upload cet APK sur le market en tant que Draft, et installe cet APK sur ton mobile.

    Autre chose, as-tu un quelconque message d'erreur dans le LogCat qui pourrait nous mettre sur la piste ?

  5. #5
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 604
    Points : 18 520
    Points
    18 520
    Par défaut
    C'est ce que j'ai fais.

    Le logcat m'indiquait que tout fonctionnait normalement.
    Ça allait jusqu'au Log.v que j'avais mis dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void applicationError(int errorCode)
    Et l'errorCode c'était 3.

    Par contre, le message vient de changer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    07-20 09:37:22.593: I/LicenseChecker(2958): Calling checkLicense on service for com.
    07-20 09:37:22.597: I/LicenseChecker(2958): Start monitoring timeout.
    07-20 09:37:22.785: I/LicenseChecker(2958): Received response.
    07-20 09:37:22.785: I/LicenseChecker(2958): Clearing timeout.
    07-20 09:37:22.785: W/LicenseValidator(2958): Error contacting licensing server.
    07-20 09:37:22.804: V/MyLicenceCheckerCallback(2958): Should not allow user access : 291
    Ça m'a déjà fait ça hier, probablement parce que je spam de requête.
    Keith Flint 1969 - 2019

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Points : 968
    Points
    968
    Par défaut
    Autre chose :
    Es-tu bien certain que ton compte principal de ton smartphone correspond bien à celui de ton compte publisher ?
    Active la synchro automatique (on sait-jamais)

    Ensuite, dans ton profil de compte publisher, va dans Modifier mon profil.
    As-tu bien recopié la clé publique ?
    Ajoute ton adresse email de ton smartphone dans les comptes de test, puis sélectionne LICENSED dans le résultat du test de license.

  7. #7
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 604
    Points : 18 520
    Points
    18 520
    Par défaut
    La synchronisation est bien activé, j'ai un compte google dans accounts & sync.
    L'adresse email correspond à celle de Google Play :
    Comma-separated list of additional Gmail addresses (aside from monadresseemail ) that will get the License Test Response from applications you manage
    Et oui j'ai bien copié la clé publique.

    Par contre je n'ai rien remplit sur Google Play au niveau de la présentation de l'application.

    Je pense être proche de la solution.
    Mais pendant qu'on parle de LicenseChecker.
    Comment ça fonctionne ?

    Est-ce que la vérification peut être effectué une seule fois ?
    Enfin dès qu'il a été confirmé que l'application est valide est-ce qu'on peut sauter le test ?
    Est-ce que l'application peut fonctionne en hors ligne ?
    Keith Flint 1969 - 2019

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Points : 968
    Points
    968
    Par défaut
    Ben je ne sais pas vraiment d'où ça peut venir :S

    Pour le fonctionnement tout est décrit ici :
    http://developer.android.com/guide/g.../overview.html

    En gros, ton appli va demander à l'application GooglePlay de vérifier la validité de l'utilisateur. L'appli GooglePlay va ensuite demander aux serveurs Google si l'utilisateur a acheté la licence et va enfin répondre à ton application.

    Normalement dans ton projet tu dois avoir deux packages google :
    com.android.vending.licensing et com.android.vending.licensing.util
    Si tu veux, tu peux créer ta propre politique (Policy) de validation. Celle utilisée par défaut est ServerManagedPolicy qui, en gros, va demander à l'utilisateur de vérifier sa licence tous les x temps. A toi de voir comment tu veux l'implémenter (soit une unique validation, soit à chaque démarrage, soit tous les jours etc)

  9. #9
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 604
    Points : 18 520
    Points
    18 520
    Par défaut
    C'est pénible comme problème.

    Là pour changer j'ai récupéré cette classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.app.Dialog;
    import android.content.DialogInterface;
    import android.content.Intent;
    import android.net.Uri;
    import android.os.Bundle;
    import android.provider.Settings.Secure;
    import android.util.Log;
     
    import com.google.android.vending.licensing.AESObfuscator;
    import com.google.android.vending.licensing.LicenseChecker;
    import com.google.android.vending.licensing.LicenseCheckerCallback;
    import com.google.android.vending.licensing.ServerManagedPolicy;
     
    public class LicenseCheck extends Activity {
     
    	private class MyLicenseCheckerCallback implements LicenseCheckerCallback {
     
    		@Override
    		public void allow(int reason) {
    			Log.v("LicenseCheck", "allow : "+reason);
    			if (isFinishing()) {
    				return;
    			}
    			startMainActivity();
    		}
     
    		@Override
    		public void dontAllow(int reason) {
    			Log.v("LicenseCheck", "dontAllow : "+reason);
    			if (isFinishing()) {
    				return;
    			}
    			showDialog(0);
    		}
     
    		@Override
    		public void applicationError(int errorCode) {
    			Log.v("LicenseCheck", "applicationError : "+errorCode);
    			if (isFinishing()) {
    				return;
    			}
    			startMainActivity();
    		}
    	}
     
    	private static final String BASE64_PUBLIC_KEY = "Ma clé";
    	private static final byte[] SALT = new byte[] { Mon sel };
    	private LicenseChecker mChecker;
    	private LicenseCheckerCallback mLicenseCheckerCallback;
     
    	private void doCheck() {
    		mChecker.checkAccess(mLicenseCheckerCallback);
    	}
     
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
     
    		String deviceId = Secure.getString(getContentResolver(),Secure.ANDROID_ID);
     
    		mLicenseCheckerCallback = new MyLicenseCheckerCallback();
    		mChecker = new LicenseChecker(this, new ServerManagedPolicy(this,
    		new AESObfuscator(SALT, getPackageName(), deviceId)),
    		BASE64_PUBLIC_KEY);
    		doCheck();
    	}
     
    	@Override
    	protected Dialog onCreateDialog(int id) {
    		return new AlertDialog.Builder(this)
    		.setTitle("Application Not Licensed")
    		.setCancelable(false)
    		.setMessage(
    		"This application is not licensed. Please purchase it from Android Market")
    		.setPositiveButton("Buy App",
    		new DialogInterface.OnClickListener() {
    			@Override
    			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() {
    			@Override
    			public void onClick(DialogInterface dialog,int which) {
    				finish();
    			}
    		}).create();
    	}
     
    	@Override
    	protected void onDestroy() {
    		super.onDestroy();
    		mChecker.onDestroy();
    	}
     
    	private void startMainActivity() {
    		startActivity(new Intent(this, BeeTrackingActivity.class));
    		finish();
    	}
    }
    Donc ça c'est l'Activity :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <intent-filter>
         <action android:name="android.intent.action.MAIN" />
         <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    Qui lance l'Activity suivante en cas de allow ou d'applicationError.

    Le problème doit venir de Google Play j'imagine.
    J'ai du mal faire quelque chose.
    Mais c'est chiant, le téléphone est synchronisé avec la bonne adresse email.
    Dans le Manifest j'ai bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <uses-permission android:name="com.android.vending.CHECK_LICENSE" />
    J'ai copié la clé publique, j'ai généré 20 bytes aléatoire.

    J'ai signé l'APK, je l'ai uploadé sur Google Play, je l'ai mis sur mon téléphone.

    Et toujours cette erreur 3...

    Pour :
    com.google.android.vending.licensing
    com.google.android.vending.licensing.util

    J'ai importé android-sdks\extras\google\play_licensing\library en le copiant dans le workspace.

    Il est Library et mon projet utilise cette library.

    =====================================
    Edit :
    Dans Google Play j'ai vu qu'on pouvait activé les APK.
    J'ai activé l'APK que j'ai signé et envoyé sur Google Play et mon téléphone.
    Toujours l'erreur 3...

    Ça va pour générer 20 bytes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    byte[] b = new byte[20];
    new Random().nextBytes(b);
     
    for(int i=0; i<20; i++){
         System.out.print(b[i]+",");
    }
    System.out.println();
    Keith Flint 1969 - 2019

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Points : 968
    Points
    968
    Par défaut
    Il ne faut pas générer le SALT aléatoirement dans ton code.
    Il doit rester identique.
    Soit tu l'écrit en dur. Soit tu créé une méthode qui génère à chaque fois le même.

  11. #11
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 604
    Points : 18 520
    Points
    18 520
    Par défaut
    Oui je l'ai généré une fois gràce à ma méthode.

    Bon ben j'ignore pourquoi mais ça fonctionne.
    J'ai mis LICENSED ça m'a mit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    V/LicenseCheck(2754): allow : 256
    J'ai mis NOT_LICENSED ça m'a mit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    V/LicenseCheck(2754): dontAllow : 561
    Donc merci.
    Pourtant je n'ai rien changé à ma façon de faire.

    J'ai signé l'APK, je l'ai envoyé et activé sur Google Play.
    Ah si j'ai essayé avec un autre téléphone.
    Keith Flint 1969 - 2019

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Points : 968
    Points
    968
    Par défaut
    Oui, si l'application n'est pas publiée, il faut obligatoirement forcer la console développeur à envoyer une réponse LICENSED

  13. #13
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 604
    Points : 18 520
    Points
    18 520
    Par défaut
    Oui je sais, mais j'avais toujours error 3 alors que ce n'était pas sûr :
    ERROR_NO_MARKET_MANAGED

    Et j'ai oublié de dire un truc :
    Dans Google Play j'ai un APK versionCode: 4 que j'ai activate.
    Si dans Eclipse j'ai versionCode: 4 dans le Manifest, je peux l'envoyer directement et ça fonctionne.

    On est pas obligé de bricoler avec un fichier APK.
    Keith Flint 1969 - 2019

  14. #14
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    J'ai également un problème au niveau de l'implémentation de ce LicenceChecker.

    Ma situation est la suivante:
    • j'ai un apk en mode draft sur google play (avec apk activé)
    • j'ai ce même apk sur mon téléphone
    • je suis identifié sur mon tel avec mon compte google play


    Mon problème est que je reçois toujours la réponse "LICENSED", alors que je change bien la réponse de test dans la console développeur.

    J'ai un peu de mal a comprendre les réponses attendus, car dans la FAQ google j'ai trouvé l'information suivante

    Licensing service troubleshooting
    How do I verify that my licensing implementation is correct?

    Before uploading the application to Google Play

    If no application with that package name and version code is on Google Play, sign into a phone with your publisher account as the primary account, set the test response, and verify that your application behaves appropriately for those responses.

    After uploading the application to Google Play
    If you’ve uploaded the application with license-checking to Google Play (regardless of the current publish state of the application), sign into a phone with your publisher account or a license test account as the primary account, set the test response, and verify that your application behaves appropriately for those responses.

    Note that the ServerManagedPolicy caches test LICENSED responses for only one minute. Normal (non-test) LICENSED responses will be cached longer.
    alors que dans le doc j'ai l'information suivante (suggérant que la réponse LICENSED est normal pour une appli en draft indépendament de la réponse de test)

    Additionally, as noted above, applications that are in draft mode (in other words, applications that have been uploaded but have never been published) will return LICENSED for all users, even if not listed as a test user. Since the application has never been offered for download, it is assumed that any users running it must have obtained it from an authorized channel for testing purposes.
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Question à propos des compilateurs
    Par elf dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 20/07/2005, 17h00
  2. Question à propos des niveaux de transaction
    Par davy.g dans le forum Oracle
    Réponses: 3
    Dernier message: 18/01/2005, 15h31
  3. Petite question à propos du redbook...
    Par Michaël dans le forum OpenGL
    Réponses: 3
    Dernier message: 04/11/2004, 12h54
  4. Petite question à propos d'une requete
    Par ViBy dans le forum Langage SQL
    Réponses: 4
    Dernier message: 15/09/2004, 12h21
  5. Une question à propos des thread
    Par tscoops dans le forum C++Builder
    Réponses: 4
    Dernier message: 07/11/2003, 14h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo