In-App-Billing v3, когда нет сети

In-App-Billing v3 реализован в моем приложении для Android со своими помощниками.

Когда нет сети, я застрял на уродливом сером экране после начала покупки.

Есть ли способ справиться с этим в нашем приложении?

В настоящее время я запрещаю покупки при запуске, когда я не получаю детали SKU из Магазина. Однако подключение может измениться после запуска. Я не нашел способа узнать, доступна ли Служба Google Play или нет.

Спасибо за вашу помощь!

Введите описание изображения здесь

Аналогичная проблема: какой код ответа делает in-app биллинг V3 возвратом после таймаута?

Новое приложение Google Play v4.0.25 теперь корректно обрабатывает это:

GPLay IAP: нет соединения

Как и предлагал NIkolay, обходным решением может быть проверка возможности подключения до начала запроса.

Если вы хотите попробовать это, вот фрагмент кода, который может вам помочь;

  1. Сначала вам нужно будет добавить некоторые разрешения в ваш файл AndroidManifest.xml; В частности, android.permission.ACCESS_NETWORK_STATE или android.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; } 

Возьмите ping-файл, чтобы проверить отказ связи с помощью вызова строки для чтения в цикле. Сделайте это перед запуском функции «Купить» (или во время «покупки») и т. Д., Чтобы проверить связь, прежде чем дать возможность серому экрану появиться после подтверждения.

В качестве альтернативы чтению содержимого можно использовать тайм-аут по умолчанию. Если байты принимают ≠ 0, продолжайте; If = 0 после 8 секунд (или n-секунд) отображает ошибку.

Это заставит ваш «уродливый серый экран» отобразиться, как если бы не было достаточного сетевого подключения для завершения проверки сервера (и, следовательно, транзакции), вы получите ошибку вместо запуска самой функции store.

Это, по сути, ручное логическое тестирование для отказа в общении по сети, а не просто чтение присутствия или состояния сети, поскольку иногда сеть может работать нормально, но связь по сети будет ошибкой или слишком медленной для приложения использование / операции / просмотр / и т.д.. Этот метод не потребует дополнительных разрешений для подтверждения сетевой связи.


Вот приблизительный пример кода, чтобы проверить, существует ли веб-страница / местоположение, не загружая файл (сохраняя пропускную способность), и все же позволяя возможность выбросить исключение или выполнить «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; } } } 

К сожалению, все предлагаемые решения до сих пор требуют проверки сетевого соединения до запуска запроса платежа, который либо обеспечивает значительную ненужную задержку при подключении пользователя, либо еще большую задержку (ожидание таймаута), когда пользователь не подключен , Или требуется разрешение, которое в противном случае было бы не всеми приложениями. Кроме того, как уже отмечалось, существует опасность ложной идентификации отсутствия (или наличия) сетевого соединения.

Кроме того, некоторые версии Google Play (по крайней мере, для некоторых версий Android) уже правильно справляются с отсутствием сетевого подключения (например, Nexus7 показывает диалог под названием «Ошибка» с текстом «Нет соединения», как и следовало ожидать и желания) , И поскольку процесс обновления приложения Google Play автоматизирован, есть надежда, что Google в конечном итоге решит эту проблему для тех версий приложения, которые в настоящее время ее демонстрируют, и когда это произойдет, приложения с агрессивными решениями захотят иметь эти Решения удалены и будут иметь ненужные накладные расходы, пока они этого не сделают.

Учитывая вышеизложенное, вполне возможно, что лучшим решением будет просто добавить выделенный текст в диалог или представление, в котором содержится кнопка, которая используется пользователем для запуска покупки, говоря

«Пожалуйста, убедитесь, что ваше устройство подключено к Интернету. Нажмите кнопку« Назад », если у вас возникнут какие-либо проблемы».

Нажатие кнопки «Назад» на сером экране, похоже, приводит к исчезновению экрана и вызывает вызов функцииActivityResult () с RESULT_CANCELED, как если бы пользователь отменил диалог оплаты. Так что пользователь выйдет из серого экрана.

Как низкотехнологичный, как этот подход, мне кажется, что это лучший из множества вариантов.