Биллинг в приложении 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, например:

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

Любые идеи, что я делаю неправильно?


person Patric    schedule 27.09.2016    source источник


Ответы (2)


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

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

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

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

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

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

person Patric    schedule 04.10.2016
comment
Это поставило меня в тупик на один день. - person nurettin; 17.12.2016
comment
если более четко: в вашем эмуляторе не было сервисов Google Play. Вы также можете проверить их, используя stackoverflow.com/a/35476962/4548520, если они не установлены, то это пользовательский проблема (телефон mb china), все равно показывает рекламу (он должен установить игровые сервисы, чтобы иметь возможность покупать ваши предметы, например, предмет для удаления рекламы) - person user25; 09.06.2018

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

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

person RoShan Shan    schedule 27.09.2016
comment
Это на самом деле не решает вопрос. - person Patric; 04.10.2016