Android 如何在不打开Play Store的情况下以编程方式安装应用程序(就像Google Drive那样)

Android 如何在不打开Play Store的情况下以编程方式安装应用程序(就像Google Drive那样),android,Android,今天Google Drive应用程序问我是否想安装新的应用程序表和文档 我已经接受了,希望它能打开谷歌游戏商店,这样我就可以按安装了 它没有。它只是向我显示了一个弹出窗口,其中包含每个应用程序的权限,以确认安装,这与在Play Store上的任何应用程序上按“安装”时显示的相同 我不知道这可以做到 我们如何在应用程序中重现这种行为:有一个按钮“安装应用程序XPTO”,它不需要打开Google Play商店?只显示“权限”对话框并通过Play Store继续安装 更新: 对于那些投反对票的人,因

今天Google Drive应用程序问我是否想安装新的应用程序表和文档

我已经接受了,希望它能打开谷歌游戏商店,这样我就可以按安装了

它没有。它只是向我显示了一个弹出窗口,其中包含每个应用程序的权限,以确认安装,这与在Play Store上的任何应用程序上按“安装”时显示的相同

我不知道这可以做到

我们如何在应用程序中重现这种行为:有一个按钮“安装应用程序XPTO”,它不需要打开Google Play商店?只显示“权限”对话框并通过Play Store继续安装


更新:

对于那些投反对票的人,因为他们认为这和其他问题一样。。。不是

在这种情况下,APK不是由Google Drive应用程序下载然后安装的。Google Drive“告诉”Play Store下载并安装。

这就是我感兴趣的API

为了支持我的案例:在Google Drive内按安装应用程序而不打开Play Store后,下载开始。在下载过程中,我已打开Play Store进行检查并:


屏幕截图证明下载和安装APK的不是谷歌硬盘。这是Play Store。

如果你知道apk文件在哪里,你可以很容易地找到它

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

我要说的是,谷歌硬盘有系统权限,就像Play商店一样。可能是因为它有谷歌的签名

如果您设法拥有“android.permission.INSTALL_PACKAGES”权限,则可以调用API(SDK管理器部署的android.jar中不包括该API,例如,您必须从emulator中的android.jar获取隐藏的API)来安装应用程序

因此,基本上,除非您拥有系统权限(通过将APK放入/system/app、使用OEM证书或root签名),否则您将无法执行此操作

来源:已编程一些系统应用程序

---更新


当然,play store可能有一些门,您可以使用它安装任何应用程序,但这可能需要您自己无法获得的权限。

Google+现在实施了一些按钮,您可以直接下载应用程序(请参阅),而无需单击play store网站上的按钮

链接如下所示:
https://play.google.com/store/apps/details?id=com.example.app&rdid=com.example.app&rdot=1&feature=md

如果您添加rdid、rdot功能参数,它将在我的手机上工作(如果我在浏览器中键入它,没有经过测试,也没有经过测试来更新应用程序,只是安装了它)

编辑

我发现您只需要将rdid参数添加到url中。资料来源:

Edit2:


不带目的地工作:(

Google Drive的日志显示,负责“告诉”Google Play Store安装应用程序的活动是

com.google.android.apps.docs/com.google.android.apps.docs.app.PhoneskyApplicationInstallerActivity
很明显,这“说明”

安装所需的软件包

因此,理论上,人们可以创造一个意图

Intent intent = new Intent("com.android.vending.billing.PURCHASE");
intent.setClassName("com.android.vending",
        "com.google.android.finsky.billing.lightpurchase.LightPurchaseFlowActivity");
intent.putExtra(EXTRA_NAME, EXTRA_VALUE);
startActivityForResult(intent, 0);
有正确的额外值,瞧

但是,从非谷歌签名的应用程序调用
LightPurchaseFlowActivity
失败,因为他们显然再次(根据日志)检查调用包的签名:

W/Finsky(13209): [1] LightPurchaseFlowActivity.setupFromExternalPurchaseIntent: Called from untrusted package.

因此,目前无法实现这一点。

可能的副本不一样。在这种情况下,APK不是由Google Drive应用程序下载然后安装的。Google Drive“告诉”Play Store下载并安装。我会发布一个屏幕截图。很有趣。如果你在上面找到了什么,你能发布答案吗?我已经四处寻找了一段时间,我认为这是不可能的。可能有一种方法,但首先很难弄清楚它是如何工作的。很可能是一个
意图
发送给Play Store会额外告诉它下载一个应用程序,但你必须对Play Store进行反向工程才能找到答案。Starred、+1等。我对此非常感兴趣。我会继续寻找解决方案。我会测试一些东西,甚至可能尝试反向工程:这不是他们使用的过程。他们会告诉Play Store下载并安装。很抱歉,我的回答不成熟。我同意你的看法,但…这不是一个系统应用程序。我可以卸载它。因此这可能是一种新的方式。我期待知道所需的权限以及如何完成。你可以在可以卸载的应用程序中拥有系统权限。你只需使用e OEM证书,操作系统将授予您这些权限(好的,如果我错了,请纠正我)即使你的应用被认为是一个系统应用,它也需要已经下载的apk来调用intent
intent.ACTION\u INSTALL\u PACKAGE
。因此,它不适用于应该从google play下载的apk。只需要知道它是否也适用于intent。如果是,你可能已经锁定了它!根据你从androidb.co的链接m、 这不会自动安装应用程序,但只会打开安装页面(用户仍需确认)。只是好奇,您尝试过吗?
http://developer.android.com/reference/android/content/Context.html#createPackageContext(java.lang.String,int)
它会引发安全异常吗?不,我没有尝试@trevor-e,我不明白这与问题的关系。
但是,从非谷歌签名的应用程序调用LightPurchaseFlowActivity失败了,因为它们显然再次失败了(根据日志),检查调用包的签名:
我发送给你的链接允许你获取另一个应用程序的上下文对象,并可能为你运行该意图。意图中的额外名称和额外值应该是什么。putExtra@TusharSaha,你说什么都无所谓
W/Finsky(13209): [1] LightPurchaseFlowActivity.setupFromExternalPurchaseIntent: Called from untrusted package.