Воспроизвести соединение с библиотекой биллинга и запросить детали sku
Мне нужно немного информации о том, как устанавливается соединение и запрашивать детали sku. Я работаю над учебником и копирую логику биллинга в приложении в свое приложение.
https://codelabs.developers.google.com/codelabs/play-billing-codelab
Я следовал за учебником без каких-либо проблем. Проблема заключается в том, как устанавливается соединение, а затем запрашиваете детали sku.
Когда я сделал экземпляр класса BillingManager, он попытается установить соединение -
public BillingManager(Activity activity) {
mActivity = activity;
mBillingClient = BillingClient.newBuilder(mActivity).setListener(this).build();
mBillingClient.startConnection(new BillingClientStateListener() {
@Override
public void onBillingSetupFinished(@BillingClient.BillingResponse int billingResponse) {
if (billingResponse == BillingClient.BillingResponse.OK) {
Log.i(TAG, "onBillingSetupFinished() response: " + billingResponse);
} else {
Log.w(TAG, "onBillingSetupFinished() error code: " + billingResponse);
}
}
@Override
public void onBillingServiceDisconnected() {
Log.w(TAG, "onBillingServiceDisconnected()");
}
});
}
Затем я сделаю асинхронный запрос, чтобы получить подробности о sku -
private void handleManagerAndUiReady() {
// Start querying for SKUs
List<String> inAppSkus = mBillingProvider.getBillingManager()
.getSkus(SkuType.INAPP);
mBillingProvider.getBillingManager().querySkuDetailsAsync(SkuType.INAPP,
inAppSkus,
new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(int responseCode,
List<SkuDetails> skuDetailsList) {
if (responseCode == BillingResponse.OK
&& skuDetailsList != null) {
for (SkuDetails details : skuDetailsList) {
Log.w(TAG, "Got a SKU: " + details);
}
}
}
});
// Show the UI
displayAnErrorIfNeeded();
}
Тогда я получил слушателя, получающего ошибку, но соединение установлено без проблем.
D/StoreListFragment: onCreate
I/StoreListFragment: SkuDetailsResponseListener response code: -1
D/StoreListFragment: onViewCreated
I/BillingManager: onBillingSetupFinished() response: 0
Поэтому мне пришлось некоторое время разобраться и сдаться, чтобы проверить основы библиотеки Play Billing -
https://medium.com/exploring-android/exploring-the-play-billing-library-for-android-55321f282929
Вот где я нашел решение, я просто поместил запрос в соединение, где оно успешно подключено. Я понял, что библиотека биллинга игры не проверяет соединение ДО того, как он отправляет запрос на детали sku, или я что-то делаю неправильно, так как учебник работает нормально?
private void createBillingClient() {
mBillingClient = BillingClient.newBuilder(getActivity()).setListener(this).build();
mBillingClient.startConnection(new BillingClientStateListener() {
@Override
public void onBillingSetupFinished(int billingResponse) {
if (billingResponse == BillingClient.BillingResponse.OK) {
Log.i(TAG, "onBillingSetupFinished() response: " + billingResponse);
//setting up a listener for the queries
SkuDetailsResponseListener responseListener = new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(int responseCode,
List<SkuDetails> skuDetailsList) {
Log.i(TAG, "response code: " + responseCode);
}
};
List<String> skuList = Arrays.asList("sku_01", "sku_02");
SkuDetailsParams skuDetailsParams = SkuDetailsParams.newBuilder()
.setSkusList(skuList).setType(BillingClient.SkuType.SUBS).build();
mBillingClient.querySkuDetailsAsync(skuDetailsParams, responseListener);
} else {
Log.w(TAG, "onBillingSetupFinished() error code: " + billingResponse);
}
}
@Override
public void onBillingServiceDisconnected() {
Log.w(TAG, "onBillingServiceDisconnected()");
}
});
}
Я попробовал эту логику, чтобы проверить, готово ли соединение, а затем выполнить исполняемый файл, как тривиальный диск - со ссылкой на этот URL. Похоже, логика не проверяет, находится ли соединение для биллинга в ожидании....
https://github.com/zumrywahid/in_app_example
Is Billing Client connected? : false
Client is already in the process of connecting to billing service.
onBillingSetupFinished() error code: 5
0 ответов
Конструктор BillingManager уже запускает соединение, и если вы инициализируете менеджер и немедленно вызываете любой метод, который передает runnable в executeServiceRequest(Runnable runnable)
также попытается установить соединение одновременно. Вы можете отключить startServiceConnection()
в конструкторе, так как статус подключения всегда проверяется в executeServiceRequest()
и запускает соединение при необходимости.
Я решил эту проблему следующим образом:
Я создал вспомогательный класс, который управляет выставлением счетов, и добавил к нему слушателей, поэтому я могу делать что-то только тогда, когда другие действия готовы.
Например, я попытался показать список покупок в приложении в onCreate
активности, но список всегда был пуст. Это было потому, что результатquerySkuDetailsAsync
был получен после выполнения кода, отображающего список. Я создал слушателя и показываю список только после получения результата.
interface BillingResponseIsAvailableListener {
void onBillingResponseIsAvailable(List<SkuDetails> theList);
}
public class BillingTools {
List<String> skuList = new ArrayList<>();
private List<BillingResponseIsAvailableListener> listeners = new ArrayList<>();
private BillingClient billingClient;
private Context context;
public BillingTools(Context context) {
this.context = context;
createSKUList(); //method to create the list of sku's for your app
}
public void addListener(BillingResponseIsAvailableListener toAdd) {
listeners.add(toAdd);
}
и когда вы запрашиваете список SKU, просто добавьте слушателя, когда список будет готов:
billingClient.querySkuDetailsAsync(params.build(), (billingResult2, skuDetailsList) -> {
if (billingResult2.getResponseCode() == BillingClient.BillingResponseCode.OK && skuDetailsList != null) {
for (BillingResponseIsAvailableListener bL : listeners) {
bL.onBillingResponseIsAvailable(skuDetailsList);
}
}
});
Приведенный выше код является всего лишь примером, я рекомендую вам создать своих собственных слушателей для всего, что вам нужно. Это часть метода, называемогоqueryOptionsList();
В вызывающем действии просто заставьте слушателя делать со списком все, что вам нужно:
BillingTools takeTheirMoney = new BillingTools(this);
takeTheirMoney.startBillingClient();
takeTheirMoney.addListener(new BillingResponseIsAvailableListener() {
@Override
public void onBillingResponseIsAvailable(List<SkuDetails> theList) {
showPurchaseOptions(findViewById(R.id.purchases_container), theList, takeTheirMoney);
}
});
takeTheirMoney.queryOptionsList();
Если у вас возникли проблемы с тем, что соединение не готово, просто добавьте другого слушателя, чтобы отслеживать успешное соединение, и в этом слушателе разместите дополнительные действия (у которых также могут быть свои собственные слушатели).