如何自动更新应用程序; Android的

时间:2014-11-10 03:57:32

标签: android android-intent installation

我正在构建一个我想通过无线方式更新的启动器应用程序。我创建了一个服务类,可以成功检查和比较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();

这实际上发布了我必须点击并按下安装的通知。一旦我这样做,它会尝试安装,但随后会给出错误的签名错误。

理想情况下,我只是希望它安装而无需查看通知。提前谢谢。

3 个答案:

答案 0 :(得分:2)

您无需使用Playstore或任何其他应用托管服务来管理您的应用升级。您的用户应该启用:从未识别的源(在他们的Android手机上)安装

对于自动升级,您必须使用相同的签名发布所有APK。如果您只是从Eclipse构建并运行应用程序,则在DIST文件夹中生成的APK文件将使用Debug键(每台计算机的默认键)进行签名

现在,如果您从不同的计算机构建相同的代码,则调试密钥值将不同,您将收到错误:“安装新的APK时,已安装了具有相同冲突签名的现有包” / p>

以下是一些解决方案:

  1. 始终从同一台机器上发布APK以进行自动升级(这绝对不可能)
  2. 使用相同的签名对所有APK进行签名。在Eclipse中:右键单击项目> Android工具>导出签名的应用程序包

答案 1 :(得分:1)

您几乎正确设置了它,但您还应该设置数据类型:

i.setType("application/vnd.android.package-archive")

此外,请勿在{{1​​}}后致电finish()。没有必要,可能会导致新意图出现问题。

您的签名冲突是另一个问题。见this answer。您尝试安装的APK使用与当前安装的密钥不同的密钥进行签名。

最后,如果没有用户的明确交互,就无法安装APK(当然,除非你有root用户)。这是出于安全原因的意图。

答案 2 :(得分:1)

直接从Android Debug Bridge部署时,我看到了“相同的签名”错误。我认为你不会在这种方法上取得成功,因为:

  1. Android安全始终需要用户授权才能安装更新(除非您已植根,或者部分系统,例如Google Play商店自动更新。
  2. Google Play总是要杀死正在运行的进程来更新它。如果您提供服务并且应用程序实际上是单独安装(即两个apks),这可能会没问题。
  3. 我在ADB中收到的相同签名错误通常是系统要求我完全卸载原始签名应用程序时。具有相同签名的两个应用程序不能同时安装;有些东西触发Android不执行同一个软件包的“升级”。
  4. 以下是允许的升级方式: Is there a way to automatically update application on Android?