Платежи в 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