播放计费库连接和查询sku详情
Play billing library connection and querying sku details
我需要一些关于如何建立连接和查询 sku 详细信息的信息。我正在编写教程并将应用内计费逻辑复制到我的应用中。
https://codelabs.developers.google.com/codelabs/play-billing-codelab
我按照教程没有任何问题。问题在于如何建立连接,然后查询 sku 详细信息。
当我创建 BillingManager 实例时 class,它会尝试建立连接 -
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 Library 的基础知识 -
https://medium.com/exploring-android/exploring-the-play-billing-library-for-android-55321f282929
这就是我找到解决方案的地方,我只是将查询放在成功连接的连接中。我意识到 play billing 库在查询 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()");
}
});
}
我尝试了这个逻辑来检查连接是否准备就绪,然后像普通驱动器一样执行 runnable - 引用这个 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
BillingManager 构造函数已经开始连接,如果您初始化管理器并立即调用任何将 runnable 传递给 executeServiceRequest(Runnable runnable)
的方法,也会尝试同时开始连接。您可以在构造函数中禁用 startServiceConnection()
,因为连接状态始终在 executeServiceRequest()
中检查并在需要时启动连接。
我通过以下方式解决了这个问题:
我创建了一个帮助程序 class 来管理计费并向其添加了侦听器,因此我只能在其他操作准备就绪时执行操作。
例如,我试图在 activity 的 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();
的方法的一部分
在调用 activity 时,只需让监听器对列表做任何你需要做的事情:
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();
如果您遇到连接未就绪的问题,只需添加另一个侦听器来监视连接是否成功,并在该侦听器中放置其他操作(也可以有自己的侦听器)。
我需要一些关于如何建立连接和查询 sku 详细信息的信息。我正在编写教程并将应用内计费逻辑复制到我的应用中。
https://codelabs.developers.google.com/codelabs/play-billing-codelab
我按照教程没有任何问题。问题在于如何建立连接,然后查询 sku 详细信息。
当我创建 BillingManager 实例时 class,它会尝试建立连接 -
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 Library 的基础知识 -
https://medium.com/exploring-android/exploring-the-play-billing-library-for-android-55321f282929
这就是我找到解决方案的地方,我只是将查询放在成功连接的连接中。我意识到 play billing 库在查询 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()");
}
});
}
我尝试了这个逻辑来检查连接是否准备就绪,然后像普通驱动器一样执行 runnable - 引用这个 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
BillingManager 构造函数已经开始连接,如果您初始化管理器并立即调用任何将 runnable 传递给 executeServiceRequest(Runnable runnable)
的方法,也会尝试同时开始连接。您可以在构造函数中禁用 startServiceConnection()
,因为连接状态始终在 executeServiceRequest()
中检查并在需要时启动连接。
我通过以下方式解决了这个问题:
我创建了一个帮助程序 class 来管理计费并向其添加了侦听器,因此我只能在其他操作准备就绪时执行操作。
例如,我试图在 activity 的 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();
的方法的一部分
在调用 activity 时,只需让监听器对列表做任何你需要做的事情:
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();
如果您遇到连接未就绪的问题,只需添加另一个侦听器来监视连接是否成功,并在该侦听器中放置其他操作(也可以有自己的侦听器)。