一个安卓应用能否安装另一个安卓应用?

18

我想知道是否有可能让已安装的 Android 应用程序去下载并安装其它应用程序?我认为这可能存在安全问题,但 Android 操作系统是否能够实现这一点?


我认为很多答案没有提及的一件事是系统应用及其拥有INSTALL_PACKAGES权限的特殊能力。如果需要这类系统应用的示例,fdroid特权扩展应用是一个很好的例子,或者 AuroraServices(一个fdroid特权扩展应用的分支)。它们在后台工作,调用系统安装程序而不会提醒用户。 - smac89
5个回答

24

严格来说,不可能。在设备上安装的每个Android包(.apk)文件都被赋予自己独特的Linux用户ID,为它创建沙盒并防止其触及其他应用程序。
如果一个应用程序要“安装”另一个应用程序,它无法给目标分配新的用户ID。只有以根级别运行的系统小程序能够实现这一点。

应用程序可以间接地使用ACTION_VIEW意图和application/vnd.android.package-archive MIME类型来调用包安装程序:系统将启动适当的“查看器”,这当然是包安装程序。

关于此主题的良好链接:http://android.amberfog.com/?p=98


仅为完整起见,我想指出您的回答排除了已经获取 Root 权限的设备。 - Caleb Hearth
有没有办法让系统像Rpond建议的那样询问用户是否允许? - Anton
@Chapso:当然,在已经root的设备上,你可以做任何想做的事情,但在这种情况下,为什么要问是否有“合法”的方法呢? - lornova
1
@Anton:没问题,你只需要查看文件,系统会检测文件类型并启动相应的查看器,我们这里是安装程序! - lornova
1
顺便说一下...这是如何调用查看器的方法:https://dev59.com/UnE85IYBdhLWcg3wvGER - lornova
答案中的链接帮了很大的忙。 - Anton

11

是的。Swype beta 就是这样工作的。你需要做的基本上是下载新版apk,并使用某些Intent(不确定是哪个)来启动包安装程序(此时它是一个新的活动,用户必须同意安装,就像从市场上下载一样)。


这是正确的。你只需要在apk上启动一个“View intent”。 - CaseyB
12
这不是在安装一个应用程序......而是调用系统安装程序......这是非常大的区别... - lornova

10

尝试这个:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(path+"/yourapp.apk")), application/vnd.android.package-archive");
startActivity(intent);

你忘记在"application/vnd.android.package-archive"中加上一个撇号了。 - Ensai Tankado

5
如果答案是否定的,那么我想知道Facebook是如何将“Messenger”应用程序与“Facebook for Android”应用程序一起安装的?
如果我没有错,“Messenger”也是一个不同的应用程序,与主要的Facebook应用程序不同。
当我们想通过Facebook应用程序聊天时,Facebook for Android应用程序不会要求安装Messenger应用程序。它已经与Facebook一起安装了。
你也可以单独安装/卸载Messenger应用程序。
我可能是错的。我没有完整的信息,但看着这个过程并应用一点逻辑,我认为我们可以从另一个应用程序安装Android应用程序。但是我正在学习并寻找它的方法。
那么他们是如何做到的呢?如果我错了,请纠正我。

我不确定。因为我的非root的安卓手机不允许我卸载Facebook应用并重新安装,所以我无法自行测试它。我猜测Facebook应用被允许拥有普通应用没有的特殊权限。就像我无法在未root的手机上卸载Facebook应用一样。我认为Google不会允许普通的安卓应用在用户未同意的情况下安装其他应用。即使是被授予设备管理权限的应用也没有安装其他应用的能力。 - Anton
9
在 Android Manifest xml 中,可以通过定义多个启动器/主活动来实现。如果您在其中定义了两个,您将看到两个快捷方式作为启动器。 - Ravindranath Akila
3
由于通过程序自我修改及修改其他“应用程序”而未经过应用商店,Facebook曾一度被禁止在Play商店中下载,原因是其“违反服务条款”。值得一提。 - Graeme
1
@RavindranathAkila 你说得对。我也已经弄清楚了。我们可以将启动器添加到任何活动中,这样它就会显示在应用程序菜单列表中。 - Vishal

0
如果您的应用程序具有根权限,您可以将要安装的apk移动到/data/app中,设备重新启动时它将被安装。

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