是否可以从 Xamarin Android 应用程序直接使用 Google Play BillingClient?

Posted

技术标签:

【中文标题】是否可以从 Xamarin Android 应用程序直接使用 Google Play BillingClient?【英文标题】:Is it possible to directly consume the Google Play BillingClient from a Xamarin Android app? 【发布时间】:2018-12-16 11:12:52 【问题描述】:

我正在将订阅集成到 Xamarin android 应用中。我可以在网上找到的所有特定于 Xamarin 的示例都使用来自 Montemagno 等人的 Plugin.InAppBilling

这当然非常方便,但只是为了尽职调查,我想看看直接消费BillingClient类需要什么,如谷歌文档中所述(例如,这里:https://developer.android.com/google/play/billing/billing_java_kotlin )。

奇怪的是,Xamarin 文档显示了如何直接使用 ios 计费类,而不是 Android 计费类。我认为Xamarin.GooglePlayServices NuGet 包可能包含我需要的内容,但我没有看到似乎与计费直接相关的内容。

任何指针将不胜感激。

【问题讨论】:

Plugin.InAppBilling 源应该在 GitHub 上可用 【参考方案1】:

TL;DR : 是的,你可以...(我使用它...)

“实施 Google Play 计费”文档中显示的类是最终使用计费 AIDL 的包装类。该 AIDL 接口是实际的计费 API,并且 AIDL 定义了对它的 IPC 调用(这不仅用于跨进程方法调用,还用于安全性)...

当您将计费 API 依赖项添加到 build.gradle 文件时,Android Studio 通过 Gradle 自动导入计费包装器和 AIDL 并为您设置所有内容。 (当然,这不是 Visual Studio 和 MSBuild 的一个选项......)

Montemagno 的 Android 应用内计费直接使用 AIDL 接口方法,并以跨平台方式封装...

要使用 Java 包装类,基本步骤是从 Jcenter Maven 存储库中获取 aar (billing-1.1.aar),创建 Xamarin.Android 绑定库,添加 aar,修复警告(如果需要,还可以使用命名空间) 并在您的 Xamarin.Android 应用程序项目中引用该库...

现在您可以直接使用 Google 文档,以及一些小的 Xamarin.Android/C# 规范化,即:

// I did not alter the original Java namespace in the binding lib
using Com.Android.Billingclient.Api; 

~~~

var billingClient = BillingClient
    .NewBuilder(this)
    .SetListener(this)
    .Build();

~~~

var flowParams = BillingFlowParams
    .NewBuilder()
    .SetSku("***XamarinTag")
    .SetType("Answer")
    .Build();

【讨论】:

警告:AIDL 现已弃用,将在未来的版本中删除。要实现 Google Play 结算功能,请使用 Google Play 结算库。 developer.android.com/google/play/billing/api 如果 xamarin 能提供官方的 nuget,那就太好了。这让我很担心 @svn 是你要找的吗? nuget.org/packages/Xamarin.Android.Google.BillingClient @batmaci 是的。很高兴它现在可用【参考方案2】:

使用 Android.BillingClient.Api.BillingClient; https://www.nuget.org/packages/Xamarin.Android.Google.BillingClient/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Android.App;
using Android.BillingClient.Api;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using static Android.BillingClient.Api.BillingClient;

namespace Android.Basic.Core

    public  class BilingSupport : Java.Lang.Object, IPurchasesUpdatedListener, IBillingClientStateListener, ISkuDetailsResponseListener, IConsumeResponseListener
    
        Context Context;
        public IList<SkuDetails> SkuDetails;
        Android.BillingClient.Api.BillingClient billingClient;
        private List<string> skuList = new List<string>()  "get_5_coins", "get_10_coins" ;
       
        public BilingSupport(Context context)
        
            this.Context = context;
            billingClient = Android.BillingClient.Api.BillingClient.NewBuilder(this.Context).SetListener(this).Build();
            billingClient.StartConnection(this);
        
       
        public void LoadPurchases()
        

            if (billingClient.IsReady)
            
                var paramse = SkuDetailsParams.NewBuilder().SetSkusList(skuList).SetType(Android.BillingClient.Api.BillingClient.SkuType.Inapp).Build();
                billingClient.QuerySkuDetails(paramse, this);
            
        
        public void PurchaseNow(SkuDetails skuDetails)
        
            var billingFlowParams = BillingFlowParams.NewBuilder().SetSkuDetails(skuDetails).Build();
            billingClient.LaunchBillingFlow(this.Context as Activity, billingFlowParams);
        
        

        public void OnBillingServiceDisconnected()
        
            Console.WriteLine("BILLING | onBillingServiceDisconnected | DISCONNECTED");
        

        public void OnBillingSetupFinished(BillingResult p0)
        
            if (p0.ResponseCode == BillingResponseCode.Ok)
            

                Console.WriteLine("BILLING | startConnection | RESULT OK");

            
            else
            
                Console.WriteLine("BILLING | startConnection | RESULT: $billingResponseCode");
            
        
        //Response code 7 in OnPurchasesUpdated.It means: Item Already Owned.
        public void OnPurchasesUpdated(BillingResult p0, IList<Purchase> p1)
        
            
        
        public void OnSkuDetailsResponse(BillingResult p0, IList<SkuDetails> p1)
        
            if (p0.ResponseCode == BillingResponseCode.Ok)
            
                Console.WriteLine("querySkuDetailsAsync, responseCode: $responseCode");
                InitProductAdapter(p1);

            
            else
            
                Console.WriteLine("Can't querySkuDetailsAsync, responseCode: $responseCode");
            
        
        public event EventHandler<IList<SkuDetails>> SkuDetailsLoaded;
        public void InitProductAdapter(IList<SkuDetails> skuDetails)
        
            this.SkuDetails = skuDetails;
            this.SkuDetailsLoaded(this, this.SkuDetails);
        
        public void ClearOrConsumeAllPurchases()
        
            
            var querylist = billingClient.QueryPurchases(Android.BillingClient.Api.BillingClient.SkuType.Inapp).PurchasesList;
            foreach (var query in querylist)
            
                var consumeParams = ConsumeParams.NewBuilder().SetPurchaseToken(query.PurchaseToken).Build();
                billingClient.Consume(consumeParams, this);
                    

        

        public void OnConsumeResponse(BillingResult p0, string p1)
        
            if (p0.ResponseCode == BillingResponseCode.Ok && p1 != null)
            
                Console.WriteLine("onPurchases Updated consumeAsync, purchases token removed: $purchaseToken");
            
            else
            
                Console.WriteLine("onPurchases some troubles happened: $responseCode");
            
        

       
    

【讨论】:

以上是关于是否可以从 Xamarin Android 应用程序直接使用 Google Play BillingClient?的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin.Android 无法检索到 Resource 问题

是否可以在 Xamarin Forms ContentView 中嵌入 Android.VideoView

如何在 Android 上管理从后台恢复的 Xamarin 表单应用程序?

Xamarin:使用本机库

Xamarin Forms - 如何检查 Android 上 RequestIgnoreBatteryOptimizations 权限的设置

可以使用 Xamarin 为原生 iOS 和 Android 应用程序创建客户端 sdk 吗?