Показывать один диалог за другим, пока проверка лицензии не пройдет

Я пытаюсь реализовать LVL (Licensing Verification Library для Android), но сталкиваюсь с проблемой при сбое проверки лицензии. Я выскакиваю диалог, который объясняет, что проверка лицензии не удалась, и представляет их двумя кнопками. Одна кнопка - "Повторить", которую я хочу немедленно сделать другой проверкой, или "Купить приложение", которое перенаправляет их на покупку приложения в App Market.

Когда я нажимаю кнопку "Повторить", по сообщениям в журнале я вижу, что моя проверка лицензирования вызвана, я получаю еще один "не разрешить" обратный вызов и пытаюсь снова показать вышеописанное диалоговое окно ошибки (я вижу, что onPrepareDialog() вызывается снова).

Проблема в том, что второй диалог на самом деле не отображается. Таким образом, пользователь может использовать приложение, даже если проверка лицензии не удалась. Почему диалоговое окно не появляется снова и снова?

Я считаю, что это весь соответствующий код:

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();
}

1 ответ

Решение

Просто как идея, попробуйте явно призвать к закрытию диалога:

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

Кроме того, если это не сработает, попробуйте использовать removeDialog(DIALOG_NO_LICENSE_ID) вместо dissmissDialog(DIALOG_NO_LICENSE_ID),

Наконец, какой код (если вообще) у вас есть в onPrepareDialog()?

Другие вопросы по тегам