Платежи в Android-приложениях: onServiceConnected никогда не вызывается, а bindService возвращает "false"

В настоящее время я пытаюсь добавить биллинг в приложении, чтобы пользователи могли делать небольшие пожертвования. Я использую последнюю версию Android Studio для разработки и следую этому руководству (шаг за шагом, и я делаю все точно так же, как упомянуто... по крайней мере, я так думаю:-)): https://developer.android.com/google/play/billing/billing_integrate.html

Файл AIDL находится в указанном месте (под src/main в пакете com.android.vending.billing), и я вижу, что он генерируется под gen папка.

Когда я тестировал поиск продуктов, я заметил, что метод onServiceConnected никогда не вызывается, это реализуется в деятельности следующим образом:

IInAppBillingService mService;

ServiceConnection mServiceConn = new ServiceConnection() {
   @Override
   public void onServiceDisconnected(ComponentName name) {
       mService = null;
   }

   @Override
   public void onServiceConnected(ComponentName name,
      IBinder service) {
       mService = IInAppBillingService.Stub.asInterface(service);
   }
};

Привязка к сервису выполняется следующим образом (в том же упражнении):

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_donation);
  Intent serviceIntent =
      new Intent("com.android.vending.billing.InAppBillingService.BIND");
  serviceIntent.setPackage("com.android.vending");
  bindService(serviceIntent, mServiceConn, Context.BIND_AUTO_CREATE);
}

Я заметил две вещи:

  • когда я покидаю пожертвование, я вижу в консоли исключение: ... has leaked ServiceConnection ... that was originally bound here - Я вижу, что некоторые люди предлагают заменить использование bindService в контексте приложения на не активность, и действительно, если я сделаю это, проблема исчезнет. Но я думаю, что это не связано с моей главной проблемой onServiceConnected никогда не звонил, а также, почему это в официальном руководстве называется деятельность?
  • bindService возвращает логическое значение, и я проверил возвращаемое значение, оно было ложным. Так что я думаю, что это проблема.

Я видел, что некоторые люди говорят, что запись для сервиса должна быть добавлена ​​в AndroidManifest.xml - вот так:

Пробовал это, но это не имело никакого значения, а также эта запись не упоминается в официальном руководстве, поэтому я считаю, что это не нужно.

Есть идеи, что я делаю не так?

2 ответа

Решение

На самом деле я выяснил, что было "не так" в то же время.

Согласно официальному руководству по тестированию в приложении для тестирования ( https://developer.android.com/google/play/billing/billing_testing.html):

Установите приложение на Android-устройстве.

Вы не можете использовать эмулятор для тестирования биллинга в приложении; Вы должны установить приложение на устройстве, чтобы протестировать биллинг в приложении.

К сожалению, этой информации не было в другом руководстве, и я обычно сначала проверяю все на эмуляторе. После развертывания приложения на реальном устройстве и его тестирования там стало ясно, что проблем нет.

Я теперь включил сообщение, которое появляется, когда bindService возвращает false, информирующее пользователя о том, что соединение с сервисом не может быть установлено в случае, если действительно существует проблема с соединением или, если я проверяю функциональность на эмуляторе, это выглядит лучше.

Я реализовал покупку в приложении, как в этом примере Google, если вы прочитаете его, вы увидите свои коды выше в классе IabHelper (Это реализовано для вас).

https://github.com/googlesamples/android-play-billing/tree/master/TrivialDrive

Другие вопросы по тегам