Android使用Intent.ACTION_INSTALL_PACKAGE启动活动并且不返回额外的返回结果

时间:2013-03-12 16:16:36

标签: android android-intent

我正在尝试对我正在编写的应用程序进行程序化更新,因为它不是Google Play应用程序,我想提供一种更新方式。

我一直在寻找如何在下载APK以获取更新后启动Android安装程序,但我需要从安装程序获取结果,告诉我更新是否成功,或者是否它已被用户取消。

我在StackOverflow上看到了很多关于此的问题,答案通常涉及使用广播接收器。问题在于它只能接收有关正在安装的软件包的意图,而不是关于取消的安装失败。

我做了一些更多的研究,似乎Intent API提供了一些额外的东西,比如Intent.EXTRA_RETURN_RESULT,如果设置为true,则应该返回安装程序活动的结果 - 我想通过onActivityResult。不幸的是,这不起作用。有没有人让这个工作/它是这样工作吗?

以下是准备安装程序活动开始的代码,我目前有:

            Intent installApp = new Intent(Intent.ACTION_INSTALL_PACKAGE);
            installApp.setData(downloadedApk);
            installApp.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true);
            installApp.putExtra(Intent.EXTRA_RETURN_RESULT, true);
            installApp.putExtra(Intent.EXTRA_INSTALLER_PACKAGE_NAME, context.getApplicationInfo().packageName);
            context.startActivityForResult(installApp, 1);

1 个答案:

答案 0 :(得分:3)

你使用片段吗? onActivityResult将从您调用startActivity(...)的Activity或Fragment中调用。片段#startActivity(...)确实存在。用它来调用Fragment的onActivityResult(...)。 如果您不使用碎片,此解决方法将起作用。

解决方法伪代码

// CURRENT_VERSION is a const with the current APK version as int

Activity#onStart() {
  super.onStart();
  checkForUpdaterResult();
  /*...*/
}

Activity#checkForUpdaterResult() {
  final int updateVersion = preferences.getInt(UPDATE_VERSION, -1);
  switch(updateVersion) {
    case -1:break;
    default: 
      // updateVersion = oldVersion is smaller than the new currentVersion
      boolean success = updateVersion < CURRENT_VERSION;
      onUpdaterPerformed(success, updateVersion , CURRENT_VERSION); 
    break;
  }
}

Activity#startUpdate(File pAPK) {
  perferences.putInt(UPDATE_VERSION, CURRENT_VERSION);
  /*...*/
}

Activity#onUpdaterPerformed(boolean pSuccess, int pFromVersion, int pToVersion) {
  Toast.show("Update success: " + pSuccess);
  /* e.g. migrate DB */
  /*...*/
}