【问题标题】:How to install applications programmatically without opening Play Store (as Google Drive does)如何在不打开 Play 商店的情况下以编程方式安装应用程序(就像 Google Drive 一样)
【发布时间】:2014-07-04 21:36:15
【问题描述】:

今天 Google 云端硬盘应用询问我是否要安装新应用表格和文档。

我已接受,希望它会打开 Google Play 商店,以便我可以按安装。

没有。它只是向我显示了带有每个应用程序权限的弹出窗口以确认安装,当您在 Play 商店中的任何应用程序上按“安装”时出现的相同。

我不知道可以这样做。

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


更新:

对于那些因为认为这与其他问题相同而投反对票的人...不是!

在这种情况下,APK 不会被 Google Drive 应用程序下载然后安装。 Google 云端硬盘“告诉”Play Store 下载和安装。

这就是我感兴趣的 API。

为了支持我的情况:在按下 INSIDE Google Drive 安装应用程序而不打开 Play 商店后,下载开始。在下载过程中,我打开了 Play 商店进行检查:

截图证明不是Google Drive下载APK并安装它。这是 Play 商店。

【问题讨论】:

  • 不一样。在这种情况下,APK 不会被 Google Drive 应用程序下载然后安装。 Google 云端硬盘“告诉”Play 商店下载和安装。我会发布截图。
  • 有趣。如果你确实找到了答案,你能发布答案吗?
  • 我已经四处寻找了一段时间,我认为这是不可能的。可能有一种方法,但首先很难弄清楚它是如何工作的。很可能是 Intent 发送到 Play 商店,并告诉它下载应用程序,但您必须对 Play 商店进行逆向工程才能解决这个问题。
  • 已加星标、+1 等。我对此非常感兴趣。我会继续寻找解决方案。将测试一些东西,甚至可能会尝试逆向工程:D

标签: android


【解决方案1】:

Google+ 现在实现了按钮,您无需点击 Play 商店网站上的按钮即可直接下载应用(请参阅 this link)。

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

如果您添加 rdid, rdotfeature 参数,它可以在我的手机上运行(如果我在浏览器中键入它,没有经过测试,也没有经过测试更新一个应用,只安装它)。

编辑

我发现您只需将 rdid-参数添加到 url。来源:http://www.androidb.com/2014/04/increase-app-installs-with-a-single-trick/

编辑2:

不符合意图。 :(

【讨论】:

  • 只需要知道它是否也适用于 Intent。如果是这样,您可能已经成功了!
  • 根据你来自androidb.com的链接,这不会自动安装应用程序,只会打开安装页面(用户仍然需要确认)。
【解决方案2】:

Google Drive 的日志显示负责“告诉”Google Play 商店安装应用的活动是

com.google.android.apps.docs/com.google.android.apps.docs.app.PhoneskyApplicationInstallerActivity

这显然是“告诉”

com.android.vending/com.google.android.finsky.billing.lightpurchase.LightPurchaseFlowActivity

安装所需的软件包。

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

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);

带有正确的额外值,瞧!

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

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

所以,这,目前无法实现。

【讨论】:

  • 只是好奇,但你试过这个吗? http://developer.android.com/reference/android/content/Context.html#createPackageContext(java.lang.String, int) 会抛出 SecurityException 吗?
  • 不,我没有尝试@trevor-e,我不明白这如何解决问题。
  • However, calling LightPurchaseFlowActivity from non-Google signed app is failing, because they are, again apparently (according to the logs), checking the calling package's signature: 我发送给您的链接允许您获取另一个应用程序的上下文对象,并可能为您运行该 Intent。
  • intent.putExtra 中的 extra_name 和 Extra_Value 应该是什么
  • @TusharSaha,你放什么都没关系。无论如何,您的尝试都会失败并出现“从不受信任的包调用”错误。
【解决方案3】:

我会说 Google 云端硬盘拥有系统权限,就像 Play 商店一样。可能是因为上面有谷歌的签名。

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

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

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

--- 更新

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

【讨论】:

  • 我同意你的观点,但是......它不是系统应用程序。我可以卸载它。所以这可能是一种新的方式。所需的许可以及如何完成是我期待知道的事情。
  • 您可以在可卸载的应用中拥有系统权限。您只需要使用 OEM 证书对应用程序进行签名,操作系统就会为您提供这些权限(AFAIK,如果我错了,请纠正我)
  • 即使您的应用程序被视为系统应用程序,它也需要已经下载的 apk 才能调用意图 Intent.ACTION_INSTALL_PACKAGE。所以它不适用于应该从 google play 下载的 apk。
【解决方案4】:

如果你知道你的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 商店下载并安装它。
  • 抱歉,我的回答太早了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多