2010-11-08 5 views
0

J'essaie d'implémenter le LVL (Licensing Verification Library pour Android), mais l'exécution d'un problème lorsque la vérification de la licence échoue. J'ouvre un dialogue qui explique que la vérification de la licence a échoué et les présente avec deux boutons. Un bouton est "Réessayer" que je veux faire immédiatement une autre vérification ou "Achat App" qui les redirige pour acheter l'application sur l'App Market. Lorsque j'appuie sur le bouton Réessayer, je peux voir à partir des messages de journalisation que mon contrôle de licence est appelé, je reçois un autre rappel "Ne permettez pas" et j'essaie d'afficher à nouveau la boîte de dialogue d'échec ci-dessus (Je vois onPrepareDialog() encore).Afficher une boîte de dialogue après l'autre jusqu'à ce que la vérification de la licence passe

Le problème est que la deuxième boîte de dialogue ne s'affiche pas réellement. Ainsi, l'utilisateur peut utiliser l'application même si la vérification de la licence a échoué. Pourquoi la boîte de dialogue n'apparaît-elle pas encore et encore?

Je crois que cela est tout le code correspondant:

private void checkLicense() { 
    Log.d(TAG, "Checking License..."); 
    this.licenseChecker.checkAccess(this.licenseCheckerCallback); 
} 

private class MyLicenseCheckerCallback implements LicenseCheckerCallback { 
    public void allow() { } 

    public void dontAllow() { 
     Log.d(TAG, "License resposne: Don't Allow"); 
     if (isFinishing()) 
      return; // Don't update UI if Activity is finishing. 
     // 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. 
     Log.d(TAG, "Showing No License Dialog"); 
     showDialog(DIALOG_NO_LICENSE_ID); 
    } 

    public void applicationError(ApplicationErrorCode errorCode) { 
     if (isFinishing()) 
      return; // Don't update UI if Activity is finishing. 
     // This is a polite way of saying the developer made a mistake 
     // while setting up or calling the license checker library. 
     showDialog(DIALOG_APPLICATION_ERROR_ID); 
    } 
} 

protected Dialog onCreateDialog(int id) { 
    Log.d(TAG, "Creating Dialog "+id); 
    switch(id) { 
    case DIALOG_NO_LICENSE_ID: 
     return this.makeRetryPurchaseDialog(getString(R.string.no_license)); 
    case DIALOG_APPLICATION_ERROR_ID: 
     return this.makeRetryPurchaseDialog(this.applicationErrorMessageForDialog); 
    } 
    return null; 
} 

private Dialog makeRetryPurchaseDialog(String message) { 
    AlertDialog.Builder builder = new AlertDialog.Builder(CalculatorTabActivity.this); 
    builder.setMessage(message).setCancelable(false) 
    .setPositiveButton("Retry", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int id) { 
      CalculatorTabActivity.this.checkLicense(); 
     } 
    }).setNegativeButton("Purchase App", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int id) { 
      CalculatorTabActivity.this.openAppMarket(); 
     } 
    }); 
    return builder.create(); 
} 
+0

Avez-vous essayé de le déboguer? applicationError appelée? Qu'en est-il de onCreateDialog? A-t-il le bon identifiant? –

Répondre

1

Tout comme une idée, essayez d'appeler explicitement destituant dialogue:

... 
.setPositiveButton("Retry", new DialogInterface.OnClickListener() { 
    public void onClick(DialogInterface dialog, int id) { 
     dissmissDialog(DIALOG_NO_LICENSE_ID); 
     CalculatorTabActivity.this.checkLicense(); 
    } 
}) 

En outre, si cela ne fonctionne pas, essayez en utilisant removeDialog(DIALOG_NO_LICENSE_ID) au lieu de dissmissDialog(DIALOG_NO_LICENSE_ID).

Enfin, quel code (le cas échéant) avez-vous dans onPrepareDialog()?

+0

Merci! removeDialog() a fait l'affaire. Mon hypothèse est qu'il y avait une sorte de condition de course où mon code de vérification de licence essayait de montrer le dialogue à nouveau avant que le premier a été rejeté. –

Questions connexes