【问题标题】:In-App-Billing v3 when no network无网络时的应用内计费 v3
【发布时间】:2013-02-11 19:08:05
【问题描述】:

In-App-Billing v3 是在我的 Android 应用中实现的,并带有它的 Helpers。

在没有网络的情况下,我在开始购买后卡在丑陋的灰色屏幕上。

有没有办法在我们的应用中处理这个问题?

目前,当我没有从商店收到 SKU 详细信息时,我会在发布时禁用购买。 但是,启动后连接可能会发生变化。我还没有找到知道 Google Play 服务是否可用的方法。

感谢您的帮助!

类似问题:Which response code does in-app billing V3 return upon timeout?

【问题讨论】:

  • 当他们点击“购买”按钮并显示错误对话框等时检查连接状态?
  • 我以为我在 IAB 的配置中遗漏了一些东西。所以我期待在 IAB 及其助手代码中找到解决方案。但你是对的,检查连接状态是一个可靠的解决方案。
  • Google Play 客户端并不能很好地处理缺乏 Internet 访问(或速度较慢)的问题,因此如果出现这种情况,您不会希望将控制权交给那里。
  • 我以前没有遇到过,也许尝试签署应用程序并尝试修复它。
  • 仅供参考,一个复杂的(也是改善的)因素是某些版本的 Android / Google Play 确实通过放置一个标题为“错误”的对话框来正确处理网络连接的缺失” 表示“没有连接”。例如,我的 Nexus7(运行 JB)会执行此操作,当您在该对话框上点击 OK 时,它会调用您的活动的 onActivityResult() 方法(表示取消购买,就像用户从通常情况下点击后退按钮一样付款对话框)。 OTOH,我运行 Gingerbread 的 Nexus One 出现了您报告的灰屏。

标签: android google-play in-app-billing


【解决方案1】:

新的 Google Play 应用 v4.0.25 现在可以正确处理此问题:

【讨论】:

    【解决方案2】:

    就像 NIkolay 建议的那样,一种解决方法是在发起请求之前检查连接。

    如果你想试试,这里有一段代码可以帮助你;

    1. 首先,您需要为您的 AndroidManifest.xml 文件添加一些权限;特别是 android.permission.ACCESS_NETWORK_STATEandroid.permission.ACCESS_WIFI_STATE

      ACCESS_NETWORK_STATE 是访问 ConnectivityManager 所必需的(一般用于网络连接),ACCESS_WIFI_STATE 允许访问 WifiManager (用于管理 Wi-Fi 连接)。

      <!-- Needed for Reachability testing / wifi vs 3g uploading -->
      <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
      
    2. 二、查看此方法判断网络状态

      public static boolean isNetworkAvailable(Context context) {
          ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
          NetworkInfo netInfo = cm.getActiveNetworkInfo();
          if (null == netInfo || !netInfo.isConnected()) {
              return false;
          }
          return true;
      }
      

    【讨论】:

    • 这绝对是一种解决方法。 OP 需要一种方法来检测通信故障,而不仅仅是网络连接的存在。
    • 这是一个可能的解决方案。但这里没有处理一个简单的案例:连接到一个 Wifi 点,但没有任何互联网连接。这种情况在用户必须经常使用浏览器登录的机场或酒店中很常见。
    • 如果您只使用 ConnectivityManager,则不需要 android.permission.ACCESS_WIFI_STATE。见developer.android.com/reference/android/net/…
    【解决方案3】:

    不幸的是,到目前为止,所有提议的解决方案都需要在启动支付请求之前检查网络连接,这会在用户连接时提供明显的不必要延迟,并且在用户连接时会产生更长的延迟(等待超时)未连接,或者需要并非所有应用程序都需要的权限。此外,如前所述,存在错误识别网络连接缺失(或存在)的危险。

    此外,Google Play 的某些版本(至少对于某些 Android 版本)已经正确处理了网络连接不足的问题(例如,Nexus7 显示一个标题为“错误”的对话框,其中包含文本“无连接”,正如人们所期望的那样和欲望)。而且,由于更新 Google Play 应用程序的过程是自动化的,因此有些希望 Google 最终会针对当前展示它的应用程序版本解决这个问题,并且当它这样做时,具有激进解决方案的应用程序将希望拥有这些解决方案已删除,并且在它们删除之前将产生不必要的开销。

    鉴于上述情况,最好的解决方案很可能是在对话框或视图中添加一些突出显示的文本,该对话框或视图包含用户用于启动购买的按钮,说

    “请确保您的设备已连接到互联网。如果遇到任何问题,请点击返回按钮。”

    在灰屏上点击后退按钮似乎会导致屏幕消失,并导致 onActivityResult() 被 RESULT_CANCELED 调用,就像用户从支付对话框中取消一样。这样可以让用户摆脱灰屏。

    尽管这种方法技术含量很低,但在我看来,它似乎是众多糟糕选择中最好的。

    【讨论】:

    • 第一个解决方案确实需要任何延迟。所以这是一个有效的检查。我不知道存在处理此类错误的 Google Play 应用程序。我的测试是在 HTC Desire(Nexus One 双胞胎)上完成的。
    • Google 非常快地为 Google Play 部署更新。这种网络错误处理不是旧设备的原因可能是因为 Google Play 安装后无法请求新权限。
    • 我不知道 Google Play 无法请求新权限;考虑到从一开始就从未要求用户批准这些权限,您认为它可以做到。确实,我的 Nexus One 具有最新版本的 Google Play 应用程序,但它仍然存在问题,因此这与权限相关可以解释问题的持续存在,尽管我不确定权限在导致或解决这个问题。
    • 是的,第一个解决方案确实不需要延迟,但它需要我个人在我自己的应用程序中不需要的权限。我打算传达的是,各种方法都需要权限或延迟,但不是两者都需要。
    猜你喜欢
    • 2015-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    相关资源
    最近更新 更多