获取版本代码时没有虚拟方法getLongVersionCode()J

问题描述 投票:-1回答:1

根据谷歌的建议,我使用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
    }
android nosuchmethoderror
1个回答
2
投票

long getLongVersionCode()方法在版本28中被添加到Android中;见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。

© www.soinside.com 2019 - 2024. All rights reserved.