【问题标题】:How to get Application Installation failed event in app如何在应用程序中获取应用程序安装失败事件
【发布时间】:2017-10-10 07:52:02
【问题描述】:

我一直在使用Action_Viewinstall apk 使用以下代码

Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE);
    intent.setDataAndType(Uri.fromFile(new File(location + "myAPK.apk")),
            "application/vnd.android.package-archive");
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);

它会在设备中打开安装提示窗口。现在用户可以安装或取消安装过程。

我只对用户点击安装包感兴趣,但由于某种原因安装失败可能是损坏的 apk 或不匹配的签名 apk 等。

安装失败时如何捕获事件..我可以从ACTION_INSTALL_PACKAGE获取结果

我已经阅读了System Broadcast Messages,但所有内容都用于添加或替换 Pacakge。

有什么线索吗?

【问题讨论】:

  • 您是否尝试过使用startActivityForResult 启动进程,然后分析回调以防在onActivityResult 上失败?
  • @nano 在打开安装提示窗口后立即触发OnActivityResult,并且不等待用户响应。
  • 再次尝试删除intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  • ACTION_INSTALL_PACKAGE的可能重复

标签: java android actionview android-install-apk


【解决方案1】:

引用the documentation for ACTION_INSTALL_PACKAGE:

输出:如果是EXTRA_RETURN_RESULT,则返回安装是否成功。

引用the documentation for EXTRA_RETURN_RESULT:

用作带有 ACTION_INSTALL_PACKAGE 或 ACTION_UNINSTALL_PACKAGE 的布尔额外字段。指定安装程序 UI 应向应用程序返回安装/卸载的结果代码。返回的结果代码将是 RESULT_OK 成功或 RESULT_FIRST_USER 失败。

因此,将EXTRA_RETURN_RESULT 添加到您的Intent,值为true,并使用startActivityForResult()

【讨论】:

    【解决方案2】:

    使用startActivityForResult 启动 Intent:

    Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE);
    intent.setDataAndType(Uri.fromFile(new File(location + "myAPK.apk")),
            "application/vnd.android.package-archive");
    intent.putExtra(Intent.EXTRA_RETURN_RESULT, true);
    startActivityForResult(intent, MY_CONSTANT);
    

    然后分析结果

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
            case ...
        }
    }
    

    【讨论】:

      【解决方案3】:

      我只想添加我自己的考虑和经验。我遇到了同样的问题。 如果您想获得结果,最好的方法是 Nano 和 CommonsWare 建议的方法。

      我想强调的是,如果您的 apk 位于内部,您可能会遇到“解析包错误”的问题。我想记住你需要在清单<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /> 中获得正确的权限。

      但我注意到还需要添加 Intent.FLAG_GRANT_READ_URI_PERMISSION。 所以完整的示例代码可能是这样的:

      Uri fileUri = FileProvider.getUriForFile(getApplicationContext(),  BuildConfig.APPLICATION_ID + ".provider", currentFile);
      Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE);
      intent.setDataAndType(fileUri,"application/vnd.android.package-archive");
      intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
      intent.putExtra(Intent.EXTRA_RETURN_RESULT, true);
      startActivityForResult(intent, APK_INSTALL_CODE);
      

      那我还记得你,这个机制都是异步的,所以如果你需要知道结果才能继续前进,你需要等待它。 我不知道这是否是最好的方法,但它有效:

      Uri fileUri = FileProvider.getUriForFile(getApplicationContext(), BuildConfig.APPLICATION_ID + ".provider", currentFile);
      Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE);
      intent.setDataAndType(fileUri,"application/vnd.android.package-archive");
      intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
      intent.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true);
      intent.putExtra(Intent.EXTRA_RETURN_RESULT, true);
      startActivityForResult(intent, APK_INSTALL_CODE);
      while (WAIT_APK_INSTALL) {
          try {
              Thread.sleep(5000);
          } catch (InterruptedException e) {
              e.printStackTrace();
          }
      }
      
      protected void onActivityResult(int requestCode, int resultCode, Intent data) {
          if (requestCode == APK_INSTALL_CODE) {
              if (resultCode == 1) {
                  WAIT_APK_INSTALL = false;
                  //SUCCESS
              }
              else {
                  //FAILED 
                  //maybe it's needed crash the app like me. In my case the installation was necessary
                  Intent intent = new Intent(getBaseContext(), ErrorActivity.class);
                  intent.putExtra(GlobalStrings.INTENT_EXTRA_MESSAGE, getString(R.string.apk_installation_failed));
                  intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); // required when starting from Application
                  startActivity(intent);
                  System.exit(1); // kill off the crashed app
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2017-10-22
        • 1970-01-01
        • 2017-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-03
        • 2015-12-19
        • 2017-11-28
        相关资源
        最近更新 更多