2010-10-18 4 views
1

J'essaie de comprendre l'ensemble de la licence Android, et devenir frustré. Dans l'émulateur, j'exécute l'application sans compte, ou celle qui ne se trouve pas dans l'environnement de test, et elle semble fonctionner correctement, renvoyant la réponse non autorisée et affichant le message Acheter maintenant l'application.Serveur de licence Android sur un périphérique

Lorsque j'essaie de l'exécuter sur un périphérique Android réel, il renvoie une licence à chaque fois, même si le compte de périphérique n'est pas celui qui se trouve dans l'environnement de test. En outre, même si elle renvoie une licence, la case "vérification de la licence" ne disparaît jamais, sauf si vous cliquez sur Annuler. Ensuite, il vous permet simplement d'utiliser l'application comme si elle était sous licence. Il s'agit principalement de C & P de l'exemple, avec quelques modifications. J'ai supprimé le bouton de vérification de la licence et la zone de texte d'état.

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    mHandler = new Handler(); 

    // Try to use more data here. ANDROID_ID is a single point of attack. 
    String deviceId = Secure.getString(getContentResolver(), Secure.ANDROID_ID); 

    // Library calls this when it's done. 
    mLicenseCheckerCallback = new MyLicenseCheckerCallback(); 
    // Construct the LicenseChecker with a policy. 
    mChecker = new LicenseChecker(
     this, new ServerManagedPolicy(this, 
      new AESObfuscator(SALT, getPackageName(), deviceId)), 
     BASE64_PUBLIC_KEY); 
    doCheck(); 

    ArrayAdapter<String> booksAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mBooks); 

    this.setListAdapter(booksAdapter); 
} 

protected Dialog onCreateDialog(int id) { 
    // We have only one dialog. 
    return new AlertDialog.Builder(this) 
     .setTitle(R.string.unlicensed_dialog_title) 
     .setMessage(R.string.unlicensed_dialog_body) 
     .setPositiveButton(R.string.buy_button, 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(R.string.quit_button, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       finish(); 
      } 
     }) 
     .create(); 
} 

private void doCheck() { 
    setProgressBarIndeterminateVisibility(true); 
    alertbox("status", getString(R.string.checking_license)); 
    mChecker.checkAccess(mLicenseCheckerCallback); 
} 

protected void alertbox(String title, String mymessage) 
{ 
    new AlertDialog.Builder(this) 
     .setMessage(mymessage) 
     .setTitle(title) 
     .setCancelable(true) 
     .setNeutralButton(android.R.string.cancel, 
      new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int whichButton){} 
     }) 
     .show(); 
} 

private void displayResult(final String result) { 
    mHandler.post(new Runnable() { 
     public void run() { 
      alertbox("status", result); 

      setProgressBarIndeterminateVisibility(false); 
     } 
    }); 
} 

private class MyLicenseCheckerCallback implements LicenseCheckerCallback { 
    public void allow() { 
     if (isFinishing()) { 
      // Don't update UI if Activity is finishing. 
      return; 
     } 
     // Should allow user access. 

     //displayResult(getString(R.string.allow)); 
    } 

    public void dontAllow() { 
     if (isFinishing()) { 
      // Don't update UI if Activity is finishing. 
      return; 
     } 
     //displayResult(getString(R.string.dont_allow)); 

     // Should not allow access. In most cases, the app should assume 
     // the user has access unless it encounters this. If it does, 
     // the app should inform the user of their unlicensed ways 
     // and then either shut down the app or limit the user to a 
     // restricted set of features. 
     // In this example, we show a dialog that takes the user to Market. 
     showDialog(0); 
    } 

    public void applicationError(ApplicationErrorCode errorCode) { 
     if (isFinishing()) { 
      // Don't update UI if Activity is finishing. 
      return; 
     } 
     // This is a polite way of saying the developer made a mistake 
     // while setting up or calling the license checker library. 
     // Please examine the error code and fix the error. 
     String result = String.format(getString(R.string.application_error), errorCode); 
     displayResult(result); 
    } 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    mChecker.onDestroy(); 
} 

Je ne sais pas ce que je dois changer pour le faire fonctionner ... ou si la licence est mis en mémoire cache en quelque sorte (bien que ce soit la première fois que je cours sur cet appareil) et si je peux le libérer sans effacer l'appareil, ce sera sympa quand je ferai des tests sur d'autres applications. En outre, comment puis-je supprimer le message "vérification de la licence" sans avoir à cliquer sur le bouton d'annulation ... devrais-je simplement faire en sorte qu'il n'apparaisse pas?

+0

Question que j'ai: Comment effacer la boîte de dialogue alertbox() qui est appelée dans doCheck() à partir de la fonction MyLicenseCheckerCallback.allow(). – AndyD273

Répondre

4

Je suis juste moi-même en licence alors ne prenez pas cela comme évangile, mais quelques choses collent:

ou si la licence est mise en mémoire cache en quelque sorte (bien que ce soit la première fois que je Je l'ai exécuté sur cet appareil) et si je peux le libérer sans effacer l'appareil, ce sera sympa quand je ferai des tests sur d'autres applications.

Vous utilisez la ServerManagedPolicy si l'approbation sera être mis en mémoire cache et brouillées. C'est la manière recommandée de le faire. (Je suppose pour fournir une meilleure expérience utilisateur et un meilleur temps de réponse) Afin de déboguer votre approbation, vous devez vous connecter à votre market profile et changer l'option "Test de réponse". Vous devez utiliser un appareil disposant du même compte que votre profil d'éditeur pour que la réponse au test fonctionne pour une application qui n'est pas encore commercialisée.

Vous n'avez également aucun code dans votre méthode allow() pour votre classe MyLicenseCheckerCallback qui devrait probablement être l'endroit où vous effacez la boîte de dialogue (en dehors du conditionnel isFinishing).

si je peux uncache sans essuyer l'appareil, comme ce sera bien quand je fais des tests sur d'autres applications

Basé sur LicenseValidator.java On dirait que l'approbation est stockée dans un fichier prefs sur com.android.vending.licensing.ServerManagedPolicy en mode privé. Vous pouvez utiliser le sharedpreferences editor pour le supprimer d'un autre endroit de l'application.

Encore une fois, je ne suis pas un pro à ce sujet mais je peux me tromper, mais je pense que vous pourriez être en mesure de résoudre votre bug si vous l'avez configuré correctement.

+0

Merci pour la réponse. Je suis assez nouveau à cela aussi, et à la programmation Java/Android en général. Y a-t-il un exemple de MyLicenseCheckerCallback dans l'exemple d'application? Je ne l'ai pas vu, et à peu près tout ce que j'utilise. Je vais regarder à nouveau, voir ce que je peux trouver. – AndyD273

Questions connexes