有些人可能会从以前的问题中记住我。我正在为 Android 构建一个应用程序,并且进展顺利。我想要的大多数功能都很好用。我自己学习了基础知识(在 StackOverflow 上一些慷慨的人的帮助下!),但我仍然认为自己是初学者(今天的问题将告诉你我是多么的初学者!)。
我的应用程序是一个动态地图,显示一个国家在特定时间点的历史。在 Google Play 上,用户可以免费下载基础应用程序(大部分是空的),然后他可以购买应用程序内计费的包(法国、美国、英国等)。这就是我卡住的地方。
我已经购买了 Milkman AndroidIAB ANE 并仔细阅读了文档(这个)。我已经设法将 ANE 添加到我的库中并更新了我的应用程序清单。我修改了示例文件以添加我的公钥和可购买包的 ID。(我不在这里发布代码,因为我不知道我是否被允许,因为 ANE 已获得许可。)
我的应用程序是这样工作的:
第一个屏幕:带有网站链接和“Enter”按钮的徽标。
当点击时,用户到达带有几个按钮的屏幕(每个包/国家一个)。
如果用户点击他拥有的包,他将被发送到所选国家的地图。
如果他不拥有它,系统会询问他是否愿意购买并发送购买。
问题:(警告:其中一些值得当月的菜鸟,但我是来学习的,对吗?)
改编自 Milkman 示例的代码位于用作 DocumentClass 的外部 .as 文件中。如何将屏幕 2 按钮与 .as 文件中的功能链接?我试过这个,但它不起作用:
franceBtn.addEventListener(MouseEvent.CLICK, checkAndPurchase); function checkAndPurchase (e:MouseEvent):void{ purchasePack1(); //function from the example, it checks if the pack is owned // and send the user to the store if not };
编辑1:这可能真的很容易做到,但我只是没有足够的经验来理解我需要做什么。我的应用中有一系列按钮(比如“franceBtn”、“usaBtn”和“ukBtn”)。单击这些按钮时,需要检查包(“francePack”、“usaPack”和“ukPack”)是否归用户所有,如果不是,则开始应用内购买。我试图向按钮添加一个 EventListener,但没有任何反应。不在屏幕上,不在日志中。
2.假设问题1已解决。我的应用程序旨在离线使用(购买额外包除外)。我理解我所读内容的方式是,应用内购买的包的“库存”是通过 Google Play 获得的,这意味着(如果我没记错的话)用户需要在线。有没有办法在存储此“库存”的设备内创建某种文件,以便可以离线访问?
编辑 2:我希望用户能够在任何地方使用该应用程序,而无需在线(显然购买包除外)。但我猜该应用程序会与 Google Play 核对,以了解已拥有哪个包。所以我正在寻找一种方法将拥有的包的“库存”直接存储在设备/应用程序中(这样它就可以离线访问并在每次互联网启动时更新。我希望它更清楚,并感谢您指出它不是。
我已经阅读了很多次文档,我真的很困惑,所以请,我真的很感激任何帮助。;)
在此先感谢,杰瑞尔
编辑 3:这是我与 IAB 相关的代码部分(按照本教程制作:here,但我并没有真正理解它。我愿意学习,但这是一个中级教程,我什么也没找到在 Internet 上解释了如何为真正的初学者做。如果你有我找不到的链接,我都听到了 :D )
import com.milkmangames.nativeextensions.android.*;
import com.milkmangames.nativeextensions.android.events.*;
import flash.events.MouseEvent;
if (AndroidIAB.isSupported()) {
AndroidIAB.create();
}
// listeners for billing service startup
AndroidIAB.androidIAB.addEventListener(AndroidBillingEvent.SERVICE_READY, onReady);
AndroidIAB.androidIAB.addEventListener(AndroidBillingEvent.SERVICE_NOT_SUPPORTED, onUnsupported);
// start the service
AndroidIAB.androidIAB.startBillingService("my_key");
function onReady(e: AndroidBillingEvent): void {
trace("service now ready- you can now make purchases.");
}
function onUnsupported(e: AndroidBillingEvent): void {
trace("sorry, in app billing won't work on this phone!");
}
// listen for inventory events
AndroidIAB.androidIAB.addEventListener(AndroidBillingEvent.INVENTORY_LOADED, onInventoryLoaded);
AndroidIAB.androidIAB.addEventListener(AndroidBillingErrorEvent.LOAD_INVENTORY_FAILED, onInventoryFailed);
function onInventoryLoaded(e: AndroidBillingEvent): void {
for each(var purchase: AndroidPurchase in e.purchases) {
trace("You own the item:" + purchase.itemId);
}
}
function onInventoryFailed(e: AndroidBillingErrorEvent): void {
trace("Something went wrong loading inventory: " + e.text);
}
// load the player's current inventory
AndroidIAB.androidIAB.loadPlayerInventory();
// listen for purchase events
AndroidIAB.androidIAB.addEventListener(AndroidBillingEvent.PURCHASE_SUCCEEDED, onPurchaseSuccess);
AndroidIAB.androidIAB.addEventListener(AndroidBillingErrorEvent.PURCHASE_FAILED, onPurchaseFailed);
function onPurchaseSuccess(e: AndroidBillingEvent): void {
var purchase: AndroidPurchase = e.purchases[0];
trace("you purchased the item " + purchase.itemId);
AndroidIAB.androidIAB.loadPlayerInventory();
}
function onPurchaseFailed(e: AndroidBillingErrorEvent): void {
trace("Something went wrong with the purchase of " + e.itemId + ": " + e.text);
}
franceBtn.addEventListener(MouseEvent.CLICK, onPackOneButtonClicked);
function onPackOneButtonClicked(e: MouseEvent) {
if (purchase.itemId == "packone") {
franceMap.visible = true;
} else {
AndroidIAB.androidIAB.purchaseItem("packone");
}
}
谢谢你的耐心!杰瑞尔