Как реализовать лицензирование Google Play для Android-приложения? [закрытый]

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

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

1 ответов


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

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

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

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

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

как вам это:

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

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

Си. После того как вы создали проект, это хорошая идея, чтобы загрузить .apk как Альфа или бета. Оставить его неопубликованный.

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

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

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

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

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

1.2 соль

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

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

b. Как мне его получить?

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

c. Куда положить соль?

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

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

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

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

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

b. Перейти к Extras

c. Установить Google Play Licensing Library

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

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

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

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

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

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

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 получение идентификатора устройства

были некоторые дебаты об этом в прошлом о том, следует ли использовать серийный sim или 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 создание программы проверки лицензий

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

b. Найти License Testing

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

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

4. Вещи, чтобы попробовать

4.1 условные лицензии проверка

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

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

4.2 шифрование SharedPreferences используя SecurePreferences

a. Идите к этому ссылке.

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

c. Прочтите ReadMe.md для получения информации о реализации этого.

5. Устранение неполадок

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

5.1 я не могу получить мое приложение, чтобы что-нибудь вернуть с сервера

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

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

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

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

d. Убедитесь allow() и dontAllow() и applicationError() есть @Override теги.

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

a. Лучшее лекарство от этого-просто ждать. Кажется, что если вы делаете много тестирования в течение короткого периода времени, он всегда будет отправлять вам код сервера 291 код повтора. Я прождал всю ночь, и на следующее утро все прошло отлично.

b. Вы можете очистить данные (а не только кэш) от Google Play app и приложение Google Play Services. Затем откройте play back up и примите все лицензии и повторите попытку.

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

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 комната для больше! Они будут идем!

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

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