Сервер лицензирования Android на устройстве

Я пытаюсь разобраться во всем, что касается лицензирования Android, и разочаровываюсь. В эмуляторе я запускаю приложение без учетной записи или с приложением, которого нет в тестовой среде, и оно, кажется, работает правильно, возвращая нелицензированный ответ и всплывающее сообщение о покупке приложения сейчас.

Когда я пытаюсь запустить его на реальном устройстве Android, он каждый раз возвращает лицензию, даже если учетная запись устройства не входит в среду тестирования. Кроме того, несмотря на то, что он возвращает лицензию, поле «проверка лицензии» никогда не исчезает, если вы не нажмете кнопку «Отмена». Затем он просто позволяет вам использовать приложение, как если бы оно было лицензировано. В основном это C&P из примера с некоторыми изменениями. Я удалил кнопку проверки лицензии и текстовое поле статуса.

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

Я просто не знаю, что мне нужно изменить, чтобы заставить его работать ... или лицензия каким-то образом кэшируется (хотя я впервые запускаю ее на этом устройстве) и могу ли я ее раскешировать, не стирая устройство, так как это будет удобно, когда я буду тестировать другие приложения. Кроме того, как удалить сообщение «проверка лицензии», не нажимая кнопку «Отмена»… должен ли я просто сделать так, чтобы оно не отображалось?


person AndyD273    schedule 18.10.2010    source источник
comment
У меня есть вопрос: как очистить диалоговое окно alertbox(), которое вызывается в doCheck() из функции MyLicenseCheckerCallback.allow().   -  person AndyD273    schedule 25.10.2010


Ответы (1)


Я только начинаю заниматься лицензированием, так что не принимайте это как истину, но кое-что бросается в глаза:

или если лицензия каким-то образом кешируется (хотя я впервые запускаю ее на этом устройстве), и если я могу раскэшировать ее, не стирая устройство, так как это будет хорошо, когда я буду тестировать другие приложения.

Вы используете ServerManagedPolicy, поэтому утверждение будет быть закэшированным и запутанным. Это рекомендуемый способ сделать это. (Я предполагаю, что это обеспечит лучший пользовательский интерфейс и лучшее время отклика). Чтобы отладить ваше утверждение, вам необходимо войти в свой профиль рынка и измените параметр "Проверить ответ". Вам нужно использовать устройство с той же учетной записью, что и ваш профиль издателя, чтобы тестовый ответ работал для приложения, которое еще не выпущено на рынок.

У вас также нет кода в вашем методе allow() для вашего класса MyLicenseCheckerCallback, который, вероятно, должен быть там, где вы очищаете диалоговое окно (вне условного isFinishing).

если я смогу распаковать его, не стирая устройство, так как это будет хорошо, когда я буду тестировать другие приложения

На основе LicenseValidator.java Похоже, что утверждение хранится в файле prefs по адресу com.android.vending.licensing.ServerManagedPolicy в приватном режиме. Вы можете использовать редактор общих настроек, чтобы очистить его из другого места в приложение.

Опять же, я еще не профессионал в этом, поэтому могу ошибаться, но я думаю, что вы сможете устранить свою ошибку, если правильно ее настроите.

person T. Markle    schedule 19.10.2010
comment
Спасибо за ответ. Я тоже новичок в этом и в программировании на Java/Android в целом. есть ли пример MyLicenseCheckerCallback в примере приложения? Я этого не видел, и почти все, что я использую, C&P. Я посмотрю еще раз, посмотрю, что смогу найти. - person AndyD273; 21.10.2010