我正在将我的应用程序中的应用内计费从Version 3升级到newer code。版本3运行良好,目前在我的应用程序中生产,但我读到它最终将被弃用。
当我尝试使用static product id (android.test.purchased)测试购买流时,BillingResult结果代码仅返回-1以及调试消息"Service connection is disconnected“。AFAIK,在较新的库中没有服务连接,但在版本3中有。
如果我使用一个真正的应用内产品代码,它会告诉我我已经购买了它,这是正确的,但我需要测试实际的购买流程。
我是在一个实际的设备(Pixel3XL)上测试的,而不是在模拟器上。我尝试在一个单独的设备上测试它,该设备是使用测试帐户(而不是开发人员)登录的,但我得到了相同的结果。
更新:我在开发者控制台中设置了一个真实的(测试)应用内托管产品,然后在使用测试(非开发者)帐户登录的设备上安装了我的应用,但我仍然收到"Service connection is disconnected“错误。我觉得这是代码之外的东西,但不确定是什么。
更新2:我创建了一个新项目,除了帐单代码之外什么都没有,它起作用了,所以我的应用程序中有什么东西导致了它崩溃。
更新3:我创建了一个新项目,并将代码从损坏的应用程序导入到其中,但仍然收到相同的错误消息。我觉得,现在,我的包名和Google的服务器返回了错误消息。
更新4:我创建了一个空白项目,但给它起的包名和我坏掉的应用程序的包名是一样的,计费也没问题,所以它不是包名。现在我的猜测是,旧的AIDL计费代码(版本3)中有一些干扰。
解决方案!在AndroidManifest.xml的application节点中,我有以下内容:tools:node="replace"。删除了该属性,计费现在可以正常工作了。
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)
}
}
}
}
});
}
});发布于 2020-08-10 07:34:19
该错误清楚地表明,由于以下可能的原因,计费客户端会断开连接。
Play服务。
以下是针对SDK 28的Android版本的计费API 3.0中的工作代码。如计费接口错误处理部分(https://developer.android.com/google/play/billing/integrate)所述,如果连接丢失,app必须负责重新建立连接。我建议使用包含Billing API的单例类,并使用billingClient.isReady()方法检查连接是否成功,如果不成功,则尝试重新建立连接。假设您在BillingClientStateListener类覆盖方法中添加了日志记录。我跳过这段代码,因为它是直接的,并且在我上面提供的链接中有很好的文档记录。
public class ApplicationBillingClient
{
static ApplicationBillingClient applicationBillingClient= null;
private static BillingClient billingClient;
private ApplicationBillingClient() {}
private static boolean isInitialized()
{
return applicationBillingClient != null && billingClient != null;
}
private static void initialize(Context applicationContext)
{
try
{
if(applicationContext != null)
{
applicationBillingClient = new ApplicationBillingClient();
BillingClient.Builder builder= BillingClient.newBuilder(applicationContext);
builder.setListener(new PurchaseActivityListener());
builder.enablePendingPurchases();
billingClient = builder.build();
}
LogUtil.info("Initializing the Billing Client");
}
catch (Exception ex)
{
LogUtil.error("Error while initializing billing client", ex);
}
}
public static ApplicationBillingClient getInstance(Context applicationContext)
{
if(isInitialized() == false)
{
initialize(applicationContext);
}
return applicationBillingClient;
}
public void startConnection()
{
billingClient.startConnection(new StateListener());
}
public boolean isReady()
{
return billingClient.isReady();
}
public void getMonthlySubscription()
{
try
{
if(billingClient.isReady())
{
SkuDetailsParams.Builder skuBuilder = SkuDetailsParams.newBuilder();
skuBuilder.setType(BillingClient.SkuType.SUBS);
skuBuilder.setSkusList(Arrays.asList(new String[]{MONTHLY_BILLING_SUBSCRIPTION_SKU}));
SkuDetailsParams params = skuBuilder.build();
billingClient.querySkuDetailsAsync(params, new SkuDetailsListener());
}
}
catch (Exception ex)
{
LogUtil.error("Error while querying async SKU for Monthly Subscription", ex);
}
}
}
//In your activity
ApplicationBillingClient appBillingClient =
ApplicationBillingClient.getInstance(applicationContext);
if (appBillingClient.isReady() == false)
{
appBillingClient.startConnection();
}
else
{
appBillingClient.getMonthlySubscription();
}发布于 2019-05-29 06:55:17
当计费中断时,这是AndroidManifest中的应用程序节点:
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:node="replace">
...
</application> 删除tools:node="replace"修复了计费问题。希望这能节省我浪费的时间。
https://stackoverflow.com/questions/56332090
复制相似问题