来自时间轴的应用内结算ANE

时间:2015-04-13 06:53:06

标签: android actionscript-3 in-app-billing flash-cc

我一直在努力了解如何使用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)吗?非常感谢你。

1 个答案:

答案 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();
}