当前位置: 首页 > 知识库问答 >
问题:

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

韩夕
2023-03-14
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!!!!!

这是我的分级配置:

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

共有1个答案

经福
2023-03-14

方法long getLongVersionCode()在版本28中被添加到Android中;参见javadoc

它清楚地存在于您正在编译的API中,否则您将得到一个编译错误。

但例外情况说明它在运行时不存在,因此您必须运行在较旧的平台上。

String versionName = BuildConfig.VERSION_NAME;

我的猜测是您使用版本名或代码属性的方式有问题。但那只是猜测。你还没给我们看密码。

另一个需要注意的是,在API version 28之前,您可以使用packageinfo.versioncode属性(javadoc)。这在API version 28中是不推荐的。因此,应该可以使用反射来调用GetLongVersionCode()方法(如果可用),并返回到使用反射来访问VersionCode属性。(或者在运行时测试build.version.sdk_int的值,以了解平台支持什么API版本。)

或者你可以将你的应用程序的最低支持Android版本设置为28个。

 类似资料: