我想验证应用程序升级到最新版本的情况,然后执行操作。考虑用户手机上的应用程序版本是2.4。他/她从Play商店升级到最新版本(2.5)。我将检查它是否是升级后的第一次运行并显示一个对话框。 (我正在使用此处给出的解决方案:Check if application is on its first run来验证首次启动)
但是,在将更新推送到Play商店之前,如何验证此类方案。我试过的是:
但是当我正在执行上述操作时,我收到以下错误: INSTALL_FAILED_UPDATE_INCOMPATIBLE
我也尝试从我的旧版apk安装应用程序,但在验证升级时会出现同样的错误。
是否还有其他方法可以验证只有在用户将应用升级到最新版本时才会显示对话框?
答案 0 :(得分:2)
我认为您收到此错误是因为商店版本(由您的发布密钥签名)和由调试密钥签名的工作室运行版本(存在于android数据文件夹中)之间的签名不一样
所以这是关于错误的,您必须构建APK,就好像您将其上传到商店,并使用您的发布密钥库签名...然后将其安装在设备上(使用adb install
或adb push然后从手机安装,或者将apk复制到手机内存,然后从手机等安装...等等吗?
现在关于第二部分,在应用更新后检测第一次运行应用/检测第一次运行,您可以根据该答案建议使用SharedPreferences
。但这还不够,因为它不会被应用版本链接/影响,这就是升级后检测第一次运行所需的内容。
您需要做的是获取您在清单文件android:versionCode
上指定的应用版本代码(整数),并且每次将版本上传到PlayStore时都必须增加它。
此代码将执行您需要的操作(您可以在要显示对话框的活动/片段中使用它)
//this code gets current version-code (after upgrade it will show new versionCode)
PackageManager manager = this.getPackageManager();
PackageInfo info = manager.getPackageInfo(this.getPackageName(), 0);
int versionCode = info.versionCode;
SharedPreferences prefs = this.getSharedPreferences("yourAppName", Context.MODE_PRIVATE);
if(prefs.getInt("last_version_code", -1) > 0){
if(prefs.getInt("last_version_code", -1) != versionCode){
//save current versionCode: 1st-run after upgrade
prefs.edit().putInt("last_version_code", versionCode).commit();
//put show the dialog code here...
} //no need for else, because app version did not change...
}else{
//save current versionCode for 1st-run ever
prefs.edit().putInt("last_version_code", versionCode).commit();
}
prefs.getInt("last_version_code", -1)
这会在密钥last_version_code
的首选项中获得最后保存的值,如果没有值(第一次运行),它将默认返回-1
。
if
检查首选项返回的值> 0(不是第一次运行)
并且它不等于清单中的那个。这意味着(升级)
如果是==-1
,您只需编写versionCode,以便下次尝试获取该值时,它将返回一个数字(保存最后一个版本代码)
如果你想将它用作方法(可以在多个地方调用) 如果应用已更新,则创建一个返回true / false的方法
public static boolean appWasUpdated(Context context){
//this code gets current version-code (after upgrade it will show new versionCode)
PackageManager manager = context.getPackageManager();
PackageInfo info = manager.getPackageInfo(context.getPackageName(), 0);
int versionCode = info.versionCode;
SharedPreferences prefs = context.getSharedPreferences("yourAppName", Context.MODE_PRIVATE);
if(prefs.getInt("last_version_code", -1) > 0){
if(prefs.getInt("last_version_code", -1) != versionCode){
//save current versionCode: 1st-run after upgrade
prefs.edit().putInt("last_version_code", versionCode).commit();
return true;
} //no need for else, because app version did not change...
}else{
//save current versionCode for 1st-run ever
prefs.edit().putInt("last_version_code", versionCode).commit();
}
return false;
}
并从activity / fragment
中调用此方法if(appWasUpdated(this)){
showMyDialog();
}
答案 1 :(得分:0)
增加你的APK版本代码。它应该高于商店中APK的versionCode。
使用相同的密钥库对APK进行签名并进行发布构建。
从商店下载旧版APK。
将新版本APK推送到您的设备。 adb push myapp.apk /sdcard/0/
。 adb install
在这种情况下无法工作。
从手机安装新的APK。它将更新现有的应用程序。