我正在构建一个我想通过无线方式更新的启动器应用程序。我创建了一个服务类,可以成功检查和比较App版本号,以确定是否需要更新。如果比较的apk版本高于当前版本,我从我的云服务器下载apk,然后打开一个对话框进行安装。
我面临的冲突是不会安装更新。我收到一条错误“已经安装了具有冲突签名的同名现有包”。我开始怀疑我的方法是否正确。我该如何解决这个问题?这就是我在做的事情。
确认更新后,我会显示一个对话框,按下确认按钮后我会使用Intent来解析应用程序URL
Intent i = new Intent(Intent.ACTION_VIEW);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.setData(Uri.parse(appUrl));
startActivity(i);
finish();
这实际上发布了我必须点击并按下安装的通知。一旦我这样做,它会尝试安装,但随后会给出错误的签名错误。
理想情况下,我只是希望它安装而无需查看通知。提前谢谢。
答案 0 :(得分:2)
您无需使用Playstore或任何其他应用托管服务来管理您的应用升级。您的用户应该启用:从未识别的源(在他们的Android手机上)安装
对于自动升级,您必须使用相同的签名发布所有APK。如果您只是从Eclipse构建并运行应用程序,则在DIST文件夹中生成的APK文件将使用Debug键(每台计算机的默认键)进行签名
现在,如果您从不同的计算机构建相同的代码,则调试密钥值将不同,您将收到错误:“安装新的APK时,已安装了具有相同冲突签名的现有包” / p>
以下是一些解决方案:
答案 1 :(得分:1)
您几乎正确设置了它,但您还应该设置数据类型:
i.setType("application/vnd.android.package-archive")
此外,请勿在{{1}}后致电finish()
。没有必要,可能会导致新意图出现问题。
您的签名冲突是另一个问题。见this answer。您尝试安装的APK使用与当前安装的密钥不同的密钥进行签名。
最后,如果没有用户的明确交互,就无法安装APK(当然,除非你有root用户)。这是出于安全原因的意图。
答案 2 :(得分:1)
直接从Android Debug Bridge部署时,我看到了“相同的签名”错误。我认为你不会在这种方法上取得成功,因为:
以下是允许的升级方式: Is there a way to automatically update application on Android?