【问题标题】:Android install apk programmatically?Android以编程方式安装apk?
【发布时间】:2018-06-08 00:34:33
【问题描述】:

我在尝试以编程方式安装 apk 并在安装后重新启动 Android 模拟器时遇到了一些问题。我提到了this thread

这是我的代码:

    Intent intent = new Intent(Intent.ACTION_VIEW);
    Uri apkURI = FileProvider.getUriForFile(mActivity, mActivity.getApplicationContext().getPackageName() + ".provider", new File(fullPath));
    intent.setDataAndType(apkURI, "application/vnd.android.package-archive");
    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    mActivity.startActivity(intent);

有什么方法可以在不启动意图的情况下安装 apk 吗?因为我在我的 AsyncTask 的doInBackground() 中执行上面的方法。然后在onPostExecute(),我需要显示一个片段,说明安装成功。

但是,使用上面的代码,在调用 startActivity() 时它只是关闭了我所有的片段。

【问题讨论】:

标签: java android installation apk


【解决方案1】:

不幸的是,您无法在没有用户干预的情况下完全在后台安装应用程序(假设您正在尝试通过使用doInBackground() 启动 Intent 来执行此操作)。当您启动该意图时,您只是将意图传递给系统的包管理器并要求它安装它。包管理器需要请求用户确认。如果没有 root 或特殊权限,即使有 android.permission.INSTALL_PACKAGES 权限,您也无法真正在后台以编程方式安装 APK。希望这能回答您的问题!

【讨论】:

  • 非常感谢!但是我可以和你核实一下安装是如何工作的吗?我不太确定。基本上当我调用上面的方法时,它只是从我指定的路径中获取 apk 并执行安装?之后,它会关闭我的所有片段并显示我打开这些片段的活动。那么如何查看是否安装成功呢?
  • 因为刚打开新的intent之后,我尝试用同样的代码检索版本号,它仍然显示没有升级的那个
  • 启动 Intent 时,系统不会立即开始安装应用程序。它实际上会询问用户是否要确认安装。要确定您的包是否已成功更新/安装,您可以通过 BroadcastReceiver 收听系统广播。见:*.com/a/16576305/394933
  • 但是我在重启意图时没有得到任何提示。你有什么想法?另外,如何从您提供的超链接中调用 onReceive()?
  • 您还在尝试从doInBackground() 启动 Intent 吗?如果是这样,请不要这样做,您应该从主线程运行startActivity(Intent)(正常情况下,没什么特别的)。如果您以前没有使用过 BroadcastReceivers,请查看:developer.android.com/guide/components/broadcasts – 跳转到“接收广播”部分。 cmets这里没有足够的空间来解释,但本质上你需要声明你想要监听的IntentFilter,然后注册接收器。