проверка лицензии для oreo

Для новых обновлений приложений Android я должен установить compileSdkversion на 26.

Когда я это делаю, у меня возникают проблемы с библиотекой торговых лицензий в следующей функции (ServerManagedPolicy.java):

private Map<String, String> decodeExtras(String extras) {
    Map<String, String> results = new HashMap<String, String>();
    try {
        URI rawExtras = new URI("?" + extras);
        List<**NameValuePair**> extraList = 
        **URLEncodedUtils**.parse(rawExtras, "UTF-8");
        for (**NameValuePair** item : extraList) {
            results.put(item.getName(), item.**getValue**());
        }
    } catch (URISyntaxException e) {
        Log.w(TAG, "Invalid syntax error while decoding extras data 
        from server.");
    }
    return results;
}

Я знаю, что эти функции устарели, но нет обновленной версии библиотеки лицензирования Android Vending Licensing, и я нигде не могу найти, как заставить ее работать для Oreo или в целом для версий выше, чем Android 19, который compileSdkversion я использую сейчас.

Кто может с этим помочь?

PS. useLibrary 'org.apache.http.legacyuseLibrary 'org.apache.http.legacy не работает. Приложение сразу вылетит.


person fausteric    schedule 23.09.2018    source источник


Ответы (1)


Попробуйте следующее:

import java.net.URLDecoder;

private static Map<String, String> decodeExtras(final String extras)
{
    final Map<String, String> results = new HashMap<>();

    try
    {
        if (TextUtils.isEmpty(extras) == false)
        {
            final String[] pairs = extras.split("&");

            if (pairs.length > 0)
            {
                for (final String pair : pairs)
                {
                    final int index = pair.indexOf('=');
                    final String name = URLDecoder.decode(pair.substring(0, index), "UTF-8");
                    final String value = URLDecoder.decode(pair.substring(index + 1), "UTF-8");

                    results.put(name, value);
                }
            }
        }
    }
    catch (UnsupportedEncodingException e)
    {
        Log.w(TAG, "Invalid syntax error while decoding extras data from server.");
    }

    return results;
}
person PerracoLabs    schedule 23.09.2018
comment
Но приложение вылетает во время проверки лицензии в файле LicenseChecker.java. Оно переходит в файл ActivityThread, функция handleLaunchActivity. Я получаю сообщение в режиме отладки: исходный код не соответствует байтовому коду - person fausteric; 24.09.2018
comment
Упомянутый вами метод handleLaunchActivity и ActivityThread не являются частью библиотеки проверки лицензии. Пожалуйста, предоставьте остальную часть кода, чтобы понять проблему. С другой стороны, если вы получаете исходный код, который не соответствует ошибке байтового кода, это означает, что вам нужно перестроить проект, потому что то, что вы установили на устройстве, и сам проект не совпадают. - person PerracoLabs; 24.09.2018
comment
compileSdkVersion 26 buildToolsVersion '28 .0.2 'minSdkVersion 14 targetSdkVersion 26 - person fausteric; 25.09.2018
comment
Перестраивая проект, я имел в виду нажать кнопку перестройки, а также обеспечить перестройку библиотеки LVL. Исходный код не соответствует байтовому, это означает, что ваш APK и исходный код проекта в Android Studio не совпадают. Выполните чистую перестройку всего проекта. - person PerracoLabs; 25.09.2018
comment
В файле LicenseChecker.java он выскакивает function boolean bindResult = mContext.bindService (new Intent (ILicensingService.class.getName ()), this, // ServiceConnection. Context.BIND_AUTO_CREATE); для функции handleLaunchActivity в файле ActivityThread из sdk android-26 и получить сообщение Исходный код не соответствует байтовому коду. Я использовал настоящее устройство Android с Android 8.1. - person fausteric; 25.09.2018
comment
Сначала я сделал чистку и перестройку. - person fausteric; 25.09.2018
comment
Как вы используете библиотеку LVL в качестве внешней библиотеки? банка? встроены прямо в проект? вы тоже перестраивали библиотеку LVL? Можете ли вы опубликовать полную трассировку ошибки? Кроме того, посмотрите этот ответ на проблему с байтовым кодом: stackoverflow.com/questions/39990752/ - person PerracoLabs; 25.09.2018
comment
Библиотека LVL встроена прямо в проект. Думаю, он тоже будет перестроен? - person fausteric; 25.09.2018
comment
Да, он будет восстановлен. Посмотрите следующий ответ на проблему с байтовым кодом. А если произойдет сбой, предоставьте полную трассировку стека, чтобы мы могли ее просмотреть: stackoverflow.com/questions/39990752/ - person PerracoLabs; 25.09.2018
comment
Забыл упомянуть, когда вы говорите, что это встроено напрямую, я предполагаю, что ваш исходный код LVL также является частью вашего основного проекта. В таком случае да, он будет восстановлен. Если библиотека встроена другим способом, убедитесь, что вы правильно перестроили LVL. - person PerracoLabs; 25.09.2018
comment
Куда я могу поместить трассировку стека? Вот небольшая часть: D / FA: Разрешение не предоставлено: android.permission.ACCESS_NETWORK_STATE D / FA: Разрешение не предоставлено: android.permission.ACCESS_NETWORK_STATE E / FA: Приложение отсутствует Разрешение ACCESS_NETWORK_STATE E / FA: Загрузка невозможна. Измерение приложений отключено. V / FA: onActivityCreated I / LicenseChecker: привязка к службе лицензирования. D / AndroidRuntime: завершение работы ВМ - person fausteric; 25.09.2018
comment
Я добавил ACCESS_NETWORK_STATE, но он все равно вылетел - person fausteric; 25.09.2018
comment
Вызвано: java.lang.IllegalArgumentException: намерение службы должно быть явным: намерение {act = com.android.vending.licensing.ILicensingService} - person fausteric; 25.09.2018
comment
Это функция, в которой происходит сбой: boolean bindResult = mContext.bindService (new Intent (ILicensingService.class.getName ()), this, // ServiceConnection. Context.BIND_AUTO_CREATE); - person fausteric; 25.09.2018
comment
Проблема в том, что LVL все еще использует неявные намерения, которые не поддерживаются последними версиями Android, и библиотека никогда не обновлялась. Справа после того, как намерение создается с помощью serviceIntent = new Intent (context, service), и перед вызовом mContext.bindService (...) добавьте эту строку: serviceIntent.setPackage (com.android.vending); это сделает намерение явным. - person PerracoLabs; 25.09.2018