2011-11-03 206 views
1

我想在我的android应用程序中实现AUTOUPDATE功能,因为它是一个未通过android市场发布的自定义应用程序。到目前为止,我有一切工作,但Android尝试安装应用程序,并说“应用程序未安装”。我不知道它是否重要,但应用程序已经在设备上,所以它是一个更新。安装APK程序

的应用程序从互联网下载并存储在SD卡中的APK文件。比我这样做:

Uri packageURI = Uri.parse("package:my_package"); 
    Intent intent = new Intent(Intent.ACTION_VIEW, packageURI); 
    intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/download/" + ApkName)), 
      "application/vnd.android.package-archive"); 
    startActivity(intent); 

任何人都可以帮忙吗?谢谢。

+0

的'Uri'要创建在第一线并投入了'Intent'第二行是由'Uri'你在第三线提供覆盖。您可以简单地删除第一行并使用采用操作字符串的单参数“Intent”构造函数。另外,不要使用连接来创建路径 - 使用'File'构造函数,将'File'和'String'作为参数。 – CommonsWare

回答

2

这里是一个片段我用,它看起来基本上是一样的你我能看到的唯一区别是使用packageURI的。我不知道如果使用packageURI会导致它不起作用,但如果我是你,我会尝试没有。

File appFile = new File(ScreenSaverActivity.this.getFilesDir() + File.separator + APPLICATION_FILE_NAME); 
Intent installIntent = new Intent(Intent.ACTION_VIEW); 
installIntent.setDataAndType(Uri.fromFile(appFile),"application/vnd.android.package-archive"); 
startActivity(installIntent); 

但是通常当你看到“应用程序未安装”的消息在尝试安装它意味着签名用于签署2 apk的是不同的,即一个是签署解除键,一个是签订调试的关键。或者,如果这两个apks是在不同的计算机上编译的,你可以用两个不同的调试密钥进行签名。

注意,即使你不通过你仍然需要产生和应用程序签名的市场分布。调试密钥在1年后过期,一旦密钥过期,您的应用将停止工作。

+0

请注意,只有在文件为'MODE_WORLD_READABLE'时,您的代码才能工作,因为它位于内部存储器上的应用程序本地位置('getFilesDir()')上。 – CommonsWare

+0

伟大的一点。我忘了提到这一点,当我执行这个时,它肯定给我适合。 – FoamyGuy

+0

是的,我想你知道它。 :-)但是我希望记录中的其他人能够通过这个答案。 – CommonsWare

0

1)检查清单文件中指定的应用程序名称是否和以前一样。

2)我想你可能必须去匹配一些包的信息。特别是如果应用程序是从不同的机器构建的,签名可能会有所不同(我对此并不是100%确定的)。 另外如果你使用Eclipse。在“运行配置”下检查,检查指定的包名是否与用于初始版本的包相同。