【问题标题】:Android replace application fails to installAndroid替换应用程序安装失败
【发布时间】:2012-06-18 16:26:03
【问题描述】:

我的应用程序实现了自动升级功能,因为该应用程序不会投放市场。 apk 文件托管在网络服务器上。我已经实现了以下链接的第一部分

Use AsyncTask and show the download progress in a dialog

现在,当我运行应用程序时,会发生以下情况。

  1. 如果有新版本可用,则应用程序会提示用户是否要升级。

  2. 如果用户选择“是”,则应用程序会从服务器下载文件。

  3. 一旦完成,应用程序就会提示用户是否要替换应用程序
  4. 如果用户点击确定,则应用程序开始安装,但失败并显示以下屏幕

没有提供关于为什么会发生这种情况的日志文件信息。请有人帮助我了解可能导致此问题的原因。这是生成 fianl 2 屏幕的默认 android 代码,而不是我的代码。

在异步任务上运行以下代码后会发生这种情况:

    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        // dismiss the progress dialog
        mProgressDialog.dismiss();
        // get the file
        String path = getFilesDir().getAbsolutePath()+ File.separator + getString(R.string.apk_file);
        File file = new File(path);
        // if it exists
        if(file.exists()) {
            // create and start the intent with the new file
            Intent intent = new Intent(Intent.ACTION_VIEW); 
            intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); 
            startActivity(intent);
        } else {
            // display error message 
            Toast.makeText(context, "File was not downloaded", Toast.LENGTH_LONG).show();
        }           
    }

如果我卸载应用程序并使用浏览器转到文件位置,应用程序会自动下载,然后我可以从下载文件夹成功安装。

这可能是应用程序在当前运行时尝试安装自身的问题吗?该文件在升级过程中下载到内部存储器,而不是 SD 卡位置,因为我无法保证用户设备会存在 SD 卡。

【问题讨论】:

  • 当您尝试升级它时,问题可能是应用程序正在运行,尽管升级过程的一部分涉及包管理器停止它正在升级的应用程序。您可以尝试在拨打startActivity(...) 后立即拨打finish()。另一个可能的原因是设备上的当前版本是 release 代码,而您正在使用 debug 代码升级(反之亦然) - 这将导致升级失败。
  • 这看起来像一个类似的问题,我怀疑当系统卸载您的 apk 然后包管理器尝试访问该区域时出现问题stackoverflow.com/questions/5443074/…
  • 嗨,Squonk。我在我的模拟器和我的安卓手机上都试过了。两者都有同样的问题。安卓手机正在使用签名的 apk 文件。
  • 好的。您是否尝试过(仅作为实验)将您的 apk 存储在外部存储上?我知道您不想这样做,但由于没有日志,它会添加另一个数据点。 PS 在用户名前使用@,否则他们不会得到您的回复,例如@idistic(@ 和用户名之间没有空格)
  • 不要添加安装包权限,它只适用于系统应用,不需要通过意图开始用户确认安装。

标签: android upgrade


【解决方案1】:
  1. 确保新旧 apk 使用相同的密钥签名并具有相同的包名称。否则你会看到同样的错误。

  2. 尝试在startActivity 之后调用finish(或仅使用System.exit)。

【讨论】:

  • 这是由于 apk 使用不同的密钥签名造成的。一个是调试,另一个是发布密钥。
猜你喜欢
  • 1970-01-01
  • 2015-12-19
  • 2017-11-28
  • 2021-12-05
  • 1970-01-01
  • 2017-10-22
  • 1970-01-01
  • 2015-05-28
  • 2017-07-29
相关资源
最近更新 更多