我一直在努力了解如何使用Milkman的应用内计费ANE(Android)已经有一段时间了(有些人可能还记得我之前的问题),但对于我的生活,我无法让它发挥作用。 我使用Flash CC进行编码。由于我还没有完全掌握Document Class等,我仍然在时间轴的第一帧编码。我的应用程序准备就绪,只是错过了这个功能,所以我真的希望有人能够帮助我。 我不需要真正喜欢的东西,只是一个如何设置一次性计费的例子。我已将ANE链接到fla并在google play console中创建了该对象。
我通常不会要求人们为我制作我的代码(我坚信解释比长期给出答案更好),但在这种情况下,我很沮丧,我会欢迎它(我可能会从中学习)。 这是我的测试fla文件:test fla和我的(不工作)代码,用于那些没有安装Flash的代码:
import com.milkmangames.nativeextensions.android.*;
import com.milkmangames.nativeextensions.android.events.*;
import flash.events.Event;
if (AndroidIAB.isSupported()) {
AndroidIAB.create();
} else {
trace("no");
return
}
// listeners for billing service startup
AndroidIAB.androidIAB.addEventListener(AndroidBillingEvent.SERVICE_READY, onReady);
AndroidIAB.androidIAB.addEventListener(AndroidBillingEvent.SERVICE_NOT_SUPPORTED, onUnsupported);
AndroidIAB.androidIAB.addEventListener(AndroidBillingEvent.INVENTORY_LOADED, onInventoryLoaded);
AndroidIAB.androidIAB.addEventListener(AndroidBillingErrorEvent.LOAD_INVENTORY_FAILED, onInventoryFailed);
AndroidIAB.androidIAB.addEventListener(AndroidBillingEvent.PURCHASE_SUCCEEDED, onPurchaseSuccess);
AndroidIAB.androidIAB.addEventListener(AndroidBillingErrorEvent.PURCHASE_FAILED, onPurchaseFailed);
// start the service
AndroidIAB.androidIAB.startBillingService("LICENCE");
function onReady(e: AndroidBillingEvent): void {
ready.text = "Service Ready";
}
// load the player's current inventory
AndroidIAB.androidIAB.loadPlayerInventory();
function onInventoryLoaded(e: AndroidBillingEvent): void {
for each(var purchase: AndroidPurchase in e.purchases) {
inventory.text = "You own the item:" + purchase.itemId;
}
}
function onInventoryFailed(e: AndroidBillingErrorEvent): void {
inventory.text = "Something went wrong loading inventory: " + e.text;
}
// listen for purchase events
function onPurchaseSuccess(e: AndroidBillingEvent): void {
var purchase: AndroidPurchase = e.purchases[0];
purchased.text = "you purchased the item " + purchase.itemId;
AndroidIAB.androidIAB.loadPlayerInventory();
}
function onPurchaseFailed(e: AndroidBillingErrorEvent): void {
purchased.text = "Something went wrong with the purchase of " + e.itemId + ": " + e.text;
}
buyTest.addEventListener(MouseEvent.CLICK, fnBuy);
function fnBuy(e: Event): void {
click.text="clicked!!"
AndroidIAB.androidIAB.purchaseItem("your_itemid");
}
function onUnsupported(e: AndroidBillingEvent): void {
ready.text = "Service Not Suported";
}
有人可以帮助我从时间轴(没有文档类或外部类)设置Milkman ANE(或IAB的任何其他ANE)吗?非常感谢你。
答案 0 :(得分:0)
您需要帮助的很可能是AS3事件系统没有特定的ANE。 AS3中的事件监听器可能稍后运行。这是因为AS3是一种异步语言。 ANE只能在准备就绪后执行才能正确运行onReady监听器,但那是你的所有代码在那时所做的。你可能期望这一行:
AndroidIAB.androidIAB.loadPlayerInventory();
在那之后跑,但你这么想是错的。这行代码已经运行,因为ANE没有准备就绪它从未触发你的onInventoryLoaded监听器。在方法/侦听器之后放置代码并不能保证事物将以该顺序运行。在您的情况下,除了方法和侦听器之外的所有代码都将首先运行(是的,包括AndroidIAB.androidIAB.loadPlayerInventory();),然后您的方法将在调用时运行,然后您的侦听器将在触发时运行。
要确保代码以正确的顺序运行,因为AS3是异步的,您必须等待事件触发才能尝试触发更多事件。
所以你等待onReady触发,然后你尝试运行下一步:
function onReady(e: AndroidBillingEvent): void {
ready.text = "Service Ready";
//ANE is ready let's try to load the inventory now.
AndroidIAB.androidIAB.loadPlayerInventory();
}