自动安装apk

15

我想知道是否可以通过编程来触发安装存储卡中的apk文件?


不,我计划以这种方式更新我的应用程序。从我的网站下载新的apk文件,然后自动安装它。 - rantravee
这就是现在的工作方式吗?如果用户已经勾选了“安装非市场应用程序”选项,他们只需浏览下载链接,成功下载后应用程序就会自动安装? - Samuh
只需点击“更新”按钮,获取下载链接,使用Android浏览器下载新的apk文件,然后安装它,至少这是我的计划。自动安装选项会非常棒,但我不确定它是否可行。 - rantravee
3个回答

20
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(fileName)), "application/vnd.android.package-archive");
startActivity(intent);

(由anddev.org提供)


有时它可以工作,有时它会报告找不到AndroidManifest文件并取消安装。 - rantravee
这可能表明你在完整地将下载的 APK 写入 Flash 或者其他东西之前就调用了startActivity()。我建议你逐步实现,首先在一个手动放置在 SD 卡上的 APK 上使用 startActivity()(例如,adb push、DDMS 文件管理器、从开发机器挂载/拖动/卸载)。一旦它按照你想要的方式工作,再将下载机制混合进去。 - CommonsWare
确实,我所说的就是这种情况。但是我观察到,如果apk文件在sdcard/download目录下,它可以被安装,但如果放在sdcard目录下,则会生成以下错误:04-15 16:51:02.686: ERROR/filemap(215): mmap(0,0) failed: Invalid argument 04-15 16:51:02.686: WARN/zipro(215): Unable to map '/sdcard/myapk.apk': Invalid argument 04-15 16:51:02.695: DEBUG/asset(215): failed to open Zip archive '/sdcard/myapk.apk' 04-15 16:51:02.695: DEBUG/filemap(215): munmap(0x0, 0) failed即使路径为:INFO/mytag(196): instalation path is : ///sdcard/myapk.apk - rantravee

4

如果有人正在寻找这些信息……

如果您想要安装一个apk,同时又以编程方式下载并存储在私人“文件”文件夹中(即“/data/data/com.yourapp.name/files”),则需要通过首先使用getFileStreamPath获取完整路径的URI,如下:

File fullPath = getFileStreamPath("name_of_downloaded_app.apk");

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(fullPath), "application/vnd.android.package-archive");
startActivity(intent);

希望这能有所帮助...

0

看看这个能不能帮到你:通过Intent安装Apk。不过我不确定这是否是正确的方法。


你以前用过这个吗?如果是,请指明 "package" 和 "xxx" 在这里是什么意思?Uri installUri = Uri.fromParts("package", "xxx", null); - rantravee

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