没有网络的In-App-Billing v3

时间:2013-02-11 19:08:05

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

In-App-Billing v3在我的Android App及其助手中实现。

当没有网络时,我在购买后就被困在一个丑陋的灰色屏幕上。

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

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

感谢您的帮助!

enter image description here

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

4 个答案:

答案 0 :(得分:7)

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

GPlay IAP: no connection

答案 1 :(得分:5)

与NIkolay建议的一样,解决方法可能是在发起请求之前检查连接性。

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

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

    访问 ConnectivityManager (一般用于网络连接)需要

    ACCESS_NETWORK_STATE 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;
    }
    

答案 2 :(得分:2)

通过在循环中对其进行字符串读取调用来托管ping文件以检查通信失败。在启动“购买”功能之前(或在“购买”功能“等期间)执行此操作以测试通信,然后在确认后出现灰色屏幕的机会。

除了读取内容之外,还可以使用超时默认值。如果字节接收≠0,则继续; 8秒(或n秒)后if = 0显示错误。

这将显示您的“丑陋的灰色屏幕”,好像没有足够的网络连接来完成服务器检查(因此,事务),您将收到错误而不是启动存储功能本身。

这本质上是一个手动布尔值,用于测试无法通过网络进行通信 - 不仅仅是读取网络的存在或状态,因为有时网络可以正常工作,但通过网络进行的通信将是错误或太慢适应应用程序使用/交易/浏览等。此方法不需要额外的权限来确认网络通信。


这是一个粗略的例子,用于检查网页/位置是否存在而不下载文件(节省带宽),仍然允许机会抛出异常或实现“IF / THEN”。 ((来源:http://singztechmusings.wordpress.com/2011/05/26/java-how-to-check-if-a-web-page-exists-and-is-available/))

import java.net.HttpURLConnection; 
import java.net.URL;

public class URLUtils {


    public static void main(String[] args) {

        System.out.println(URLUtils.checkIfURLExists("http://www.google.com/"));
    }
    public static boolean checkIfURLExists(String targetUrl) {

        HttpURLConnection httpUrlConn;

        try {

            httpUrlConn = (HttpURLConnection) new URL(targetUrl)

                    .openConnection();

            httpUrlConn.setRequestMethod("HEAD");

            // Set timeouts in milliseconds
            httpUrlConn.setConnectTimeout(30000);

            httpUrlConn.setReadTimeout(30000);

            // Print HTTP status code/message for your information.
            System.out.println("Response Code: "

                    + httpUrlConn.getResponseCode());

            System.out.println("Response Message: "

                    + httpUrlConn.getResponseMessage());
            return (httpUrlConn.getResponseCode() == HttpURLConnection.HTTP_OK);
        } catch (Exception e) {
            System.out.println("Error: " + e.getMessage());
            return false;
        }
    }
}

答案 3 :(得分:0)

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

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

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

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

点击灰色屏幕上的后退按钮似乎会导致屏幕消失,并导致使用RESULT_CANCELED调用onActivityResult(),就像用户已从付款对话框中取消一样。这将使用户脱离灰色屏幕。

对于这种方法来说,低技术,对我而言似乎是最好的选择。