Нет виртуального метода getLongVersionCode () J при получении кода версии - PullRequest
0 голосов
/ 09 марта 2019

Согласно предложению Google, я использую getLongVersionCode, чтобы получить код версии, подобный этому:

private long getCurrentCode() {
    try {
        return context.getPackageManager()
                .getPackageInfo(context.getPackageName(), 0).getLongVersionCode();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return -1;
}

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

Process: com.xxxxx.debug, PID: 25754
    java.lang.NoSuchMethodError: No virtual method getLongVersionCode()J in class Landroid/content/pm/PackageInfo; or its super classes (declaration of 'android.content.pm.PackageInfo' appears in /system/framework/framework.jar)
        at com.xxxxx.common.ApplicationUpdateTask.getCurrentCode(ApplicationUpdateTask.java:329)
        at com.xxxxx.common.ApplicationUpdateTask.<init>(ApplicationUpdateTask.java:84)

Итак, я решил использовать:

String versionName = BuildConfig.VERSION_NAME;

но теперь это возвращение похвалы -1 !!!!!

Это моя конфигурация gradle:

compileSdkVersion 28
    buildToolsVersion '28.0.3'
    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 66
        versionName '2.0.66'
        applicationId 'com.xxxxxx.yyyyy'
        multiDexEnabled true
    }

1 Ответ

2 голосов
/ 09 марта 2019

Метод long getLongVersionCode() был добавлен в Android в версии 28;см. javadoc

Он явно присутствует в API, с которыми вы компилируете, в противном случае вы получите ошибку компиляции.

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

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

String versionName = BuildConfig.VERSION_NAME;

Имя и код версииразные вещи.Может быть, вы использовали BuildConfig.VERSION_CODE?

И я не знаю, что вы имеете в виду под этим:

но теперь это похвальное возвращение -1 !!!!!

Мое предположениев том, что вы используете имя версии или атрибуты кода, что-то не так.Но это только предположение.Вы не показали нам код.


Еще одна вещь, которую стоит отметить, это то, что до API версии 28 вы могли использовать атрибут PackageInfo.versionCode ( javadoc ).Это было объявлено устаревшим в API версии 28. Таким образом, должна быть возможность использовать отражение для вызова метода getLongVersionCode(), если он доступен, и отступить к использованию отражения для доступа к атрибуту versionCode.(Или проверьте значение Build.VERSION.SDK_INT во время выполнения, чтобы выяснить, какую версию API поддерживает платформа.)

Или вы можете просто установить минимальную поддерживаемую версию Android для своего приложения на 28.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...