.apk文件未以编程方式安装

时间:2018-01-18 13:16:18

标签: android signature android-install-apk

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

但我得到"解析错误"或"未安装应用程序"

如果我手动尝试安装.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

那你觉得怎么样?

1 个答案:

答案 0 :(得分:2)

由不同密钥签名的两个版本的应用程序无法相互安装。

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

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

如果您尝试在应用的调试版本上安装应用的发布版本,那么它将无法正常工作,您首先必须卸载旧版本。

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