Я обновляю биллинг в приложении в моем приложении с Версия 3 до более новый код . Версия 3 работает нормально, и сейчас она работает в моем приложении, но я читал, что со временем она устареет.
Когда я пытаюсь проверить поток покупок с использованием статического идентификатора продукта (android.test.purchased), код результата BillingResult
возвращает только -1 с сообщением об отладке «Подключение к сервису отключено ». AFAIK, в новой библиотеке нет служебного соединения, но оно было в версии 3.
Если я использую реальный код продукта в приложении, он говорит, что я его уже приобрел, и это правильно, но мне нужно проверить фактический поток покупок.
Я тестирую это на реальном устройстве (Pixel 3 XL), а не на эмуляторе. Я пытался протестировать его на отдельном устройстве, которое вошло с тестовой учетной записью (не разработчиком), но я получаю те же результаты.
ОБНОВЛЕНИЕ: я установил настоящий (тестовый) управляемый в приложении продукт в консоли разработчика, затем установил свое приложение на устройство, которое вошло в систему с тестовой (не разработчиком) учетной записью, и я все еще получаю " Ошибка подключения службы. Я чувствую, что это что-то вне кода, но не уверен, что.
ОБНОВЛЕНИЕ 2: Я создал новый проект, в котором ничего не было, кроме биллингового кода, и он работал, поэтому в моем приложении есть что-то, что вызывает его поломку.
ОБНОВЛЕНИЕ 3: я создал новый проект и импортировал в него код из сломанного приложения, но все еще получаю то же сообщение об ошибке. Я чувствую, что что-то с именем моего пакета и серверами Google возвращает сообщение об ошибке.
ОБНОВЛЕНИЕ 4: Я создал пустой проект, но дал ему то же имя пакета, что и у моего сломанного приложения, и биллинг сработал, поэтому это не имя пакета. Теперь я думаю, что есть что-то из старого биллингового кода AIDL (версия 3), которое мешает.
РЕШЕНИЕ !!! Это имеет нулевой смысл, но в узле application
в AndroidManifest.xml
у меня было это: tools:node="replace"
. Убрал этот атрибут и биллинг теперь работает. WTF !!!!
mBillingClient = BillingClient.newBuilder(this).enablePendingPurchases().setListener(this).build();
mBillingClient.startConnection(new BillingClientStateListener() {
@Override
public void onBillingSetupFinished(BillingResult billingResult) {
if (billingResult.getResponseCode() == OK) {
final Purchase.PurchasesResult purchasesResult = mBillingClient.queryPurchases(BillingClient.SkuType.INAPP);
if (purchasesResult.getResponseCode() == OK) {
final List<Purchase> purchases = purchasesResult.getPurchasesList();
for (final Purchase purchase : purchases) {
}
}
}
}
@Override
public void onBillingServiceDisconnected() {
CommonUtils.showToast(mActivity, "disconnected");
}
});
mUnlockPremiumButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
final List<String> skuList = new ArrayList<> ();
skuList.add(getString(R.string.inapp_premium_product_id));
final SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder()
.setSkusList(skuList)
.setType(BillingClient.SkuType.INAPP);
mBillingClient.querySkuDetailsAsync(params.build(),
new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(BillingResult billingResult, List<SkuDetails> skuDetailsList) {
for (SkuDetails skuDetails : skuDetailsList) {
if (getString(R.string.inapp_premium_product_id).equals(skuDetails.getSku())) {
final BillingFlowParams flowParams = BillingFlowParams.newBuilder()
.setSkuDetails(skuDetails)
.build();
final BillingResult result = mBillingClient.launchBillingFlow(mActivity, flowParams);
if (result.getResponseCode() == ITEM_ALREADY_OWNED)
{
CommonUtils.showToast(mActivity, getString(R.string.alert_purchased));
}
else if (result.getResponseCode() != OK)
{
//always returns a getResponseCode of -1 (service disconnected)
}
}
}
}
});
}
});