来自 Timeline 的应用内结算 ANE

In-App Billing ANE from Timeline

我一直在尝试了解如何使用 Milkman 的应用内结算 ANE (Android) 已经有一段时间了(有些人可能还记得我之前的问题)但是对于我来说,我可以让它工作。 我使用 Flash CC 编写代码。由于我还没有完全掌握 Document Class 之类的东西,所以我仍然在时间轴的第一帧进行编码。我的应用程序已准备就绪,只是缺少该功能,所以我真的希望有人能够帮助我。 我不需要非常花哨的东西,只是一个如何设置一次性计费的示例。我已将 ANE 链接到 fla 并在 google 播放控制台中创建了对象。

我通常不会要求别人为我编写代码(我坚信从长远来看,解释比仅仅给出答案要好),但在这种情况下,我很对我会欢迎它感到沮丧(我可能会从中吸取教训)。 这是我的测试 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";
}

有人可以帮助我从时间轴(没有文档 Class 或外部 类)设置 Milkman ANE(或任何其他用于 IAB 的 ANE)吗?非常感谢你。

很可能您需要帮助的是 AS3 事件系统,而不是那个特定的 ANE。 AS3 中事件的侦听器稍后可能 运行。这是因为 AS3 是一种异步语言。该 ANE 只能在准备就绪后执行,这正确 运行s onReady 侦听器,但这就是您的所有代码在这一点上所做的。您可能期望以下行:

AndroidIAB.androidIAB.loadPlayerInventory();
之后

到 运行 但你这样想就错了。该行代码已经 运行 并且由于 ANE 在准备就绪时尚未准备就绪,因此它从未触发您的 onInventoryLoaded 侦听器。将代码放在 methods/listener 之后并不能保证事情会按 运行 的顺序进行。在您的情况下,除了方法和侦听器之外的所有代码都将首先 运行 (是的,包括 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();
}