Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

Я уже давно занимаюсь лицензированием в своем приложении и, наконец, работаю. Я хотел поделиться некоторыми вещами, которые я нашел полезными для начала работы, а также некоторыми проблемами и решениями, которые я нашел со всеми. Учебник по андроиде 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 Соль

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

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

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

Это - хорошая ссылка для создания случайной соли. Должно быть ровно 20 случайных целых чисел, поэтому поставьте 20 in для количества генерируемых случайных строк, каждая строка должна быть длиной 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 и нажмите 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 Проверка условной лицензии

а. Вы можете попробовать этот код, если вы сохраняете данные 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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