2010-10-18 6 views
1

Я пытаюсь выяснить всю лицензионную вещь 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(); 
} 

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

+0

Вопрос: У меня есть: Как очистить диалоговое окно alertbox(), которое вызывается в doCheck() из функции MyLicenseCheckerCallback.allow(). – AndyD273

ответ

4

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

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

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

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

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

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

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

+0

Спасибо за ответ. Я тоже довольно новичок в этом, а также в программировании на Java/Android. есть пример MyLicenseCheckerCallback в примере приложения? Я не видел этого, и в значительной степени C & P все, что я использую. Я посмотрю еще раз, посмотрю, что я могу найти. – AndyD273

Смежные вопросы