我正在使用Android应用程序(使用mono / Xamarin实现),允许非消费类应用内购买(用户只需购买一次功能,然后他们就可以永久访问所有设备) 。我正在尝试使用Xamarin.InAppBilling组件来完成此任务。
根据Xamarin.InAppBilling组件(http://components.xamarin.com/view/xamarin.inappbilling)的文档,这些事件可供我使用:
Xamarin.InAppBilling定义了以下可以进行的事件 监控并回复:
OnConnected - 在组件附加到Google Play时触发。
OnDisconnected - 当组件与Google Play分离时触发。
OnInAppBillingError - 在组件内部发生错误时引发。
OnProductPurchasedError - 购买产品或订阅时出错。 >
OnProductPurchase - 成功购买产品时启动。
OnPurchaseConsumedError - 在购买时出错时触发。
OnPurchaseConsumed - 成功消费购买时提升。
我看到OnConnected,OnDisconnected和OnInAppBillingError事件被定义为Xamarin.InAppBilling.InAppBillingServiceConnection类的一部分。
在程序集浏览器中,我发现其他事件被定义为Xamarin.InAppBilling.InAppBillingHandler类的一部分,但我不确定访问这些事件的最佳方法,因为它们不能通过IInAppBillingHandler接口获得。通过属性Xamarin.InAppBilling.InAppBillingServiceConnection.BillingHandler访问它们是有意义的,但该属性返回一个实例强制转换为IInAppBillingHandler而不是InAppBillingHandler类。
我的问题:
我是否应该期望此代码能够作为内联评论注意到它?
// When activity starts...
_serviceConnection = new InAppBillingServiceConnection (CurrentContext, publicKey);
_serviceConnection.OnConnected += () =>
{
var bh = _serviceConnection.BillingHandler as InAppBillingHandler;
bh.OnProductPurchased += (sku) => {
// This code should run when call to BuyProduct is successful
var purchasedProductId = sku;
};
bh.OnProductPurchasedError += (int responseCode, string sku) => {
// This code should run when call to BuyProduct is NOT successful
var p = sku;
Toast.MakeText(this, "KP - purchase error: " + p, ToastLength.Long).Show();
};
};
// When "Buy" button is clicked. Expect OnProductPurchasedError or OnProductPurchased to be called as a result of a call to this
_serviceConnection.BillingHandler.BuyProduct(_selectedProduct);
我通过添加上面的代码修改了组件中包含的示例代码进行了测试,并且OnProductPurchasedError事件似乎经常被引发(通常在Google Play UI之前说购买成功)。即使Google Play用户界面显示交易成功,我也没有看到OnProductPurchased事件处理程序被调用。有时,在显示Google Play用户界面之前会调用此事件,以允许用户输入付款方式。
我的期望是,只要成功完成购买,就会调用挂钩到OnProductPurchased的事件处理程序。但是,这似乎没有发生,我找不到这些事件的任何文档(除了我在这里粘贴的内容)。此外,传递给OnProductPurchasedError事件处理程序的响应代码始终为0.
正如我已经完成了发表这个问题的研究,我现在的理论是这些事件没有按照我的预期发挥作用,并且文档不正确。
注意:我使用android.test.purchased作为产品ID。我在重新测试之前正在消费购买,我假设将其重置为非购买状态。
有没有人成功利用这些活动?
答案 0 :(得分:5)
我知道回答有点迟,但希望它可以帮助其他人!
您似乎可能错过了将活动结果从您的活动传回BillingHandler。
protected override void OnActivityResult (int requestCode, Result resultCode, Intent data)
{
// Ask the open service connection's billing handler to process this request
service.BillingHandler.HandleActivityResult (requestCode, resultCode, data);
}
这将导致BillingHandler使用结果并触发相应的事件:)