根据谷歌的建议,我使用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
}
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。