【问题标题】:.apk file not installed programmatically.apk 文件未以编程方式安装
【发布时间】:2018-01-18 13:16:18
【问题描述】:

我想要 .apk 文件,这是我的应用程序上的新版本。安装在安卓设备上进行升级;

但我收到“解析错误”或“未安装应用程序”

如果我手动尝试安装 .apk 文件删除旧版本应用程序。 ,它有效 如果我在调试旧版本应用程序后手动尝试安装 .apk 文件,它不起作用

我在我的代码上测试了另一个不同的 .apk 文件,它可以安装,所以我不考虑这个,但你可以检查一下;

 File fileTest = new File(Environment.getExternalStorageDirectory() + "/download/appName.apk");
    if (fileTest != null && fileTest.exists() == true){
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/download/appName.apk")), "application/vnd.android.package-archive");
        startActivity(intent);

这个问题可能是签名不同Sdk版本不同。 我测试的签名与我的代码应用程序和 .apk 文件不同;

 Signature sig = updateContext.getPackageManager().
           getPackageInfo(updateManager.updateContext.getPackageName(), 
            PackageManager.GET_SIGNATURES).signatures[0];

Signature releaseSig = updateManager.updateContext.getPackageManager().
  getPackageArchiveInfo(path2, PackageManager.GET_SIGNATURES).signatures[0];

String path2 =Environment.getExternalStorageDirectory() + 
            "/download/appName.apk";

if (sig.hashCode() != releaseSig.hashCode()) //false

那你怎么看?

【问题讨论】:

  • 我不知道SDK,但要替换的应用程序的签名必须相同。我已经在使用不同计算机上构建的调试应用程序时遇到过这个问题(生成的签名不同)
  • 转到设置卸载两个应用程序(或)两个用户应用程序,在某些手机有两个或多个用户帐户也删除这些应用程序,并通过调试模式安装应用程序。

标签: android signature android-install-apk


【解决方案1】:

不能相互安装由不同密钥签名的应用的两个版本。

您的调试版本由您计算机上的调试密钥自动签名。

您的应用程序发布版本由您提供的密钥签名。

如果您尝试安装应用程序的发布版本而不是应用程序的调试版本,则它将无法正常工作,您首先必须卸载旧版本。

在现实生活中这应该不是问题,因为用户只能访问应用程序的发布版本(当然,如果您不向他们发送调试版本)。

【讨论】:

  • 你说卸载旧版本但是当我调试旧版本时安装了.apk 那我该怎么办?调试时我可以用 .apk 均衡我的应用签名吗?
  • 没有。仅在调试版本应用程序之上安装调试版本。在旧版本之上安装新版本。不要混合它们。