Intereting Posts
Открытие ссылки на браузер через уведомление не работает Глядя на стену (GridView?), Которая выходит за пределы экрана, и пользователь может коснуться ее, чтобы переместить ее Android Wifi прямого множественного соединения ad-hoc Получить URI файла .mp3, хранящегося в папке res / raw в android Как заставить Android Volley выполнять HTTPS-запрос, используя сертификат, подписанный Unkown CA? Как стилизовать элементы меню на панели действий Android Событие синхронизации добавлено программно с календарем Google в android Прекратить прослушивание отпечатков пальцев при выключенном экране Управление кодом / сборкой для магазинов приложений Android (Google / Amazon / etc)? Проектирование приложения для Android-планшета ActionBar со значком и текстом в портретном режиме Сделать AppBarLayout отвечать на прокрутку в WebView Когда использовать ShapeRenderer, Mesh + SpriteBatch, Box2D и Scene2D в Libgdx? Android – проблемы с перетаскиванием и обрезкой Как установить Android SDK в NetBeans 8.0

Как я могу реализовать лицензирование Google Play для Android-приложения?

Я ознакомился с инструкциями библиотеки лицензирования Android-Developer, но обзор, похоже, опустил несколько ключевых шагов в этом процессе и не смог полностью объяснить, как заставить что-то работать.

Может ли кто-то предоставить явный набор операций, которые работали, чтобы получить библиотеку лицензирования, установленную в приложении для Android, чтобы он проверял, чтобы пользователь платил за приложение в Google Play, прежде чем разрешить использовать?

Solutions Collecting From Web of "Как я могу реализовать лицензирование Google Play для Android-приложения?"

Я уже некоторое время работаю над лицензированием в своем приложении и, наконец, работаю. Я хотел поделиться некоторыми вещами, которые я нашел полезными для начала работы, а также некоторыми проблемами и решениями, которые я нашел со всеми. Учебник по андроиде dev, который я привел ниже, в порядке, но это было не так полезно для меня, поэтому я решил сделать учебник. Наслаждайтесь, и я надеюсь, что это вам поможет!

Ссылка на страницу разработчика здесь .

1. Начало работы

Вещи, которые вам понадобятся.

1.1 Уникальный ключ приложения Base64

Как его получить:

а. Перейдите в консоль разработчика. Ссылка.

б. Если вы еще не создали черновик приложения для своего приложения, сделайте это сейчас.

с. После того, как вы создали черновик, рекомендуется загрузить ваш .apk как Alpha или Beta. Оставьте его неопубликованным.

д. Нажмите Services & APIs

е. Прокрутите вниз и найдите YOUR LICENSE KEY FOR THIS APPLICATION

е. Скопируйте ключ в свое приложение следующим образом:

 private static final String BASE64_PUBLIC_KEY = "YOUR LICENSE KEY FOR THIS APPLICATION"; 

Убедитесь, что нет пробелов.

1.2. Соль

а. Что такое соль?

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

б. Как его получить?

Это хорошая ссылка для создания случайной соли. Должно быть ровно 20 случайных целых чисел, поэтому введите 20 в для количества случайных строк для генерации, каждая строка должна быть длиной 2 символа (используется для этого примера, это не обязательно). Проверьте числовые цифры и проверьте идентичные строки. Они также могут быть отрицательными. Попробуйте удалить любую избыточность, например 00 -> 0 , ради последовательности.

с. Где я могу положить соль?

При объявлении переменных просто введите этот код, за исключением вашей случайной соли.

 private static final byte[] SALT = new byte[] {YOUR RANDOM SALT, COMMA SEPARATED, 20 INTEGERS}; 

2. Импорт библиотеки LVL (Licensing) в Eclipse и код, который вам нужен

2.1 Импорт библиотеки

а. Открыть Android SDK Manager

б. Перейти к Extras

с. Установка Google Play Licensing Library

д. Найдите путь установки SDK который указан в верхней части менеджера SDK.

е. Когда вы там, перейдите к: <sdk>/extras/google/play_licensing

е. В eclipse щелкните file затем import , затем Existing Android Code Into Workspace в play_licensing Existing Android Code Into Workspace и когда он попросит вас play_licensing путь к файлу, перейдите в папку play_licensing и щелкните по library .

г. Как только проект с именем library был импортирован, щелкните его правой кнопкой мыши, а затем удалите properties . Нажмите Android слева и перейдите в нижнюю часть и проверьте « Is Library , затем нажмите «Применить». Это позволяет eclipse знать, что вы можете использовать этот код проекта как библиотеку.

час Щелкните правой кнопкой мыши на своем приложении, в которое вы добавляете лицензию, и нажмите свойства, а затем нажмите Android . Перейдите в нижнюю часть и щелкните library и добавьте ее в путь сборки. Это должно импортировать библиотеку в папку Android Dependencies .

я. Ваш проект настроен для перехода к следующему шагу.

2.2 Переменные для объявления вместе с вашими SALT и KEY

 private Handler mHandler; private LicenseChecker mChecker; private LicenseCheckerCallback mLicenseCheckerCallback; boolean licensed; boolean checkingLicense; boolean didCheck; 

2.3 Код

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

  private void doCheck() { didCheck = false; checkingLicense = true; setProgressBarIndeterminateVisibility(true); mChecker.checkAccess(mLicenseCheckerCallback); } private class MyLicenseCheckerCallback implements LicenseCheckerCallback { @Override public void allow(int reason) { // TODO Auto-generated method stub if (isFinishing()) { // Don't update UI if Activity is finishing. return; } Log.i("License","Accepted!"); //You can do other things here, like saving the licensed status to a //SharedPreference so the app only has to check the license once. licensed = true; checkingLicense = false; didCheck = true; } @SuppressWarnings("deprecation") @Override public void dontAllow(int reason) { // TODO Auto-generated method stub if (isFinishing()) { // Don't update UI if Activity is finishing. return; } Log.i("License","Denied!"); Log.i("License","Reason for denial: "+reason); //You can do other things here, like saving the licensed status to a //SharedPreference so the app only has to check the license once. licensed = false; checkingLicense = false; didCheck = true; showDialog(0); } @SuppressWarnings("deprecation") @Override public void applicationError(int reason) { // TODO Auto-generated method stub Log.i("License", "Error: " + reason); if (isFinishing()) { // Don't update UI if Activity is finishing. return; } licensed = true; checkingLicense = false; didCheck = false; showDialog(0); } } protected Dialog onCreateDialog(int id) { // We have only one dialog. return new AlertDialog.Builder(this) .setTitle("UNLICENSED APPLICATION DIALOG TITLE") .setMessage("This application is not licensed, please buy it from the play store.") .setPositiveButton("Buy", 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("Exit", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { finish(); } }) .setNeutralButton("Re-Check", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { doCheck(); } }) .setCancelable(false) .setOnKeyListener(new DialogInterface.OnKeyListener(){ public boolean onKey(DialogInterface dialogInterface, int i, KeyEvent keyEvent) { Log.i("License", "Key Listener"); finish(); return true; } }) .create(); } 

2.4 Получение идентификатора вашего устройства

В прошлом были некоторые споры о том, следует ли использовать сим-серию или TelephonyManager.getDeviceId(); Но обычно рекомендуется использовать следующий код, чтобы получить ANDROID_ID вашего устройства для максимальной совместимости.

 String deviceId = Secure.getString(getContentResolver(), Secure.ANDROID_ID); Log.i("Device Id", deviceId); //AN EXAMPLE OF LOGGING THAT YOU SHOULD BE DOING :) 

2.5 Создание проверки лицензии

а. Перед вызовом doCheck(); Вы должны поместить этот код в свое приложение, чтобы убедиться, что все создано правильно.

 mHandler = new Handler(); mLicenseCheckerCallback = new MyLicenseCheckerCallback(); mChecker = new LicenseChecker(this, new ServerManagedPolicy(this, new AESObfuscator(SALT, getPackageName(), deviceId)), BASE64_PUBLIC_KEY); 

Когда я делал свое заполнение LVL, я читал, что если у вас возникли проблемы с лицензированием, вы можете изменить первое this в mChecker = new LicenseChecker(this... для getApplicationContext() , мой, казалось, работал без него, но на всякий случай.

2.6 Добавление разрешений

а. Есть два разрешения, которые необходимо добавить в файл manifest приложений.

 <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="com.android.vending.CHECK_LICENSE"/> 

2.7 Убедитесь, что у вас есть правильный импорт!

Вы, наверное, уже это сделали, но я решил, что это будет хорошее место для вас.

2.8 Как вызвать лицензию для проверки

а. Просто позвоните doCheck(); Когда вы хотите проверить лицензию. Например, если приложение находится в первом запуске, выполните проверку.

3. Как проверить лицензию, чтобы убедиться, что она работает до публикации?

3.1 Настройка тестового устройства

а. У меня есть мой личный телефон, который я также использую для тестирования. Рекомендуется, чтобы на телефоне была зарегистрирована только одна учетная запись Google, исторически это облегчает ситуацию. Вы можете проверить учетные записи, выбрав Settings -> Accounts .

3.2 Настройка консоли разработчика

а. Откройте консоль разработчика и перейдите в « Settings с левой стороны.

б. Найти License Testing

с. Убедитесь, что ваш адрес электронной почты указан в Gmail accounts with testing access

д. Теперь вы можете изменить тестовый ответ на все, что угодно, для тестирования. Приложение должно ответить соответствующим образом. Помните, что если вы сохраняете данные через SharedPrefs, вам нужно очищать данные приложения каждый раз, когда вы его проверяете. Убедитесь, что вы нажали кнопку «Сохранить» после изменения тестового ответа, иначе ничего не произойдет! Я забыл об этом несколько раз, и у меня закончилась мигрень, затем я увидел эту вонючую кнопку сохранения. Лол.

4. Что нужно попробовать

4.1 Условная проверка лицензии

а. Вы можете попробовать этот код, если вы сохраняете данные SharedPreferences в SharedPreferences .

  if(didCheck==false){ Toast.makeText(this, "Checking application license...", Toast.LENGTH_SHORT).show(); doCheck(); Log.i("Checking!", "Checking license!"); } 

4.2. Шифрование ваших SharedPreferences с помощью SecurePreferences

а. Перейдите по этой ссылке .

б. Скопируйте и вставьте код из SecurePreferences.java в класс с таким же именем в свой проект.

с. Прочитайте ReadMe.md для получения информации об этом.

5. Устранение сбоев

Лицензирование может быть одним из главных проблем для устранения неполадок, просто потому, что есть много других вещей, которые могут пойти не так. Например, могут возникнуть проблемы с сетью или проблемы с сервером, которые заставляют вас разорвать ваши волосы. Использование соответствующего ведения журнала поможет в этом, вы также можете получить коды ответов сервера, если есть проблема, и вы можете отслеживать их на сервере или в вашем приложении. Мне приходилось делать это несколько раз.

5.1. Я не могу заставить свое приложение ничего не возвращать с сервера.

Возможные исправления:

а. Убедитесь, что ваше приложение имеет правильный KEY .

б. Убедитесь, что вы регистрируете каждый шаг прогресса

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

д. Убедитесь, что allow() и dontAllow() и applicationError() имеют теги @Override .

5.2. Мое приложение всегда говорит LICENSED или NOT_LICENSED независимо от того, что я установил в ответ теста

а. Лучшее лекарство, которое у меня есть для этого, – это просто подождать. Похоже, что если вы проведете много тестов за короткий промежуток времени, он всегда отправит вам код сервера 291 который является кодом повтора. Я ждал всю ночь, и все утро работало нормально.

б. Вы можете очистить данные (а не только кеш) от приложения Google Play и приложения Google Play Services. Затем откройте воспроизведение и подтвердите все лицензии и повторите попытку.

с. Очистите данные приложения.

5.3 Список кодов ответов сервера для отладки

Вы должны получить эти десятичные значения для int reason если вы их запишите. Используйте эту таблицу, чтобы указать, что сервер фактически отправляет в ваше приложение.

 LICENSED = Hex: 0x0100, Decimal: 256 NOT_LICENSED = Hex: 0x0231, Decimal: 561 RETRY = Hex: 0x0123, Decimal: 291 LICENSED_OLD_KEY = Hex: 0x2, Decimal: 2 ERROR_NOT_MARKET_MANAGED = Hex: 0x3, Decimal: 3 ERROR_SERVER_FAILURE = Hex: 0x4, Decimal: 4 ERROR_OVER_QUOTA = Hex: 0x5, Decimal: 5 ERROR_CONTACTING_SERVER = Hex: 0x101, Decimal: 257 ERROR_INVALID_PACKAGE_NAME = Hex: 0x102, Decimal: 258 ERROR_NON_MATCHING_UID = Hex: 0x103, Decimal: 259 

5.4 номер больше! Они придут!

Надеюсь, это поможет вам, ребята! Я пытался поделиться своими головными болями и исправлениями с вами, ребята, насколько это возможно, и надеюсь, что это поможет!

Если бы я сделал какие-либо ошибки, не забудьте рассказать мне о них, чтобы я мог их исправлять как можно скорее!