安卓替换应用安装失败

4

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

使用AsyncTask并在对话框中显示下载进度

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

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

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

  3. 下载完成后,应用程序会提示用户是否要替换应用程序 Replace prompt
  4. 如果用户点击确定,则应用程序开始安装但出现以下屏幕 enter image description here

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

在异步任务上运行以下代码之后会出现此问题:

    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卡。

1
可能的问题是在升级过程中应用程序正在运行,尽管升级过程的一部分涉及包管理器停止正在升级的应用程序。您可以尝试在调用startActivity(...)之后立即调用finish()。另一个可能的原因是设备上的当前版本是“发布”代码,而您正在使用“调试”代码进行升级(或反之亦然),这将导致升级失败。 - Squonk
这看起来像是一个类似的问题,我怀疑当系统卸载您的apk时,包管理器尝试访问该区域时出现了问题。http://stackoverflow.com/questions/5443074/android-internal-data-save-getfilesdir - Idistic
嗨,Idistic。我已经在使用openFileOutput(getString(R.string.apk_file), Context.MODE_WORLD_READABLE);,所以这不是问题所在。 - Comic Coder
2
好的。你试过(只是作为实验)将你的apk存储在外部存储器上吗?我知道你不想这样做,但这会增加另一个数据点,因为没有日志。PS在用户名称前使用@,否则他们不会收到你的回复,例如@idistic(@和用户名之间没有空格)。 - Idistic
1
不要添加安装包权限,它仅适用于系统应用程序,并且在通过意图开始用户确认的安装时不需要。 - Chris Stratton
显示剩余3条评论
1个回答

5
  1. 请确保旧版和新版apk使用相同的签名密钥并且包名也相同,否则会出现相同的错误。

  2. 尝试在调用startActivity后立即调用finish关闭当前活动(或者直接使用System.exit)。


1
这是由于apk使用不同的密钥签名造成的。一个是调试密钥,另一个是发布密钥。 - Comic Coder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接