空氣擴張式呼吸是Adobe Air Native Extension(ANE),可為多個Android市場(當地人和全球)購買產品。
..................................................
我們準備了2個類型項目模板:

它使用Google Play In-App計費版本3 API。
支持功能:
請閱讀文檔並在提出任何問題之前嘗試ANE。
http://developer.android.com/google/play/billing/index.html
http://help.adobe.com/en_us/air/extensions/index.html
將iabilling.ane文件從包裝文件夾添加到您的Adobe Air Project。
教程:如何將Anes嵌入FlashBuilder,Flash(Animate)和FlashDevelop
將所有項目插入“ _items”數組中。
從市場控制台獲取base64key,並替換為'== 5AMP1E8A5E64KE7 =='。
另外,如果您想添加新市場,則必須使用“ bindeurl”和“ packageurl”添加新案例。
import com.gerantech.extensions.iab.Iab ;
import com.gerantech.extensions.iab.Purchase ;
import com.gerantech.extensions.iab.events.IabEvent ;
...
// provide all sku items
_items = new Array ( "my.product.id1" , "my.product.id2" , "my.product.id3" ) ;
var _marketName : String = "google" ;
var base64Key : String , bindURL : String , package URL:String;
switch ( _marketName ) {
case "google" :
base64Key = "==5AMP1E8A5E64KE7==" ;
bindURL = "com.android.vending.billing.InAppBillingService.BIND" ;
packageURL = "com.android.vending" ;
break;
case "cafebazaar" :
base64Key = "==5AMP1E8A5E64KE7==" ;
bindURL = "ir.cafebazaar.pardakht.InAppBillingService.BIND" ;
packageURL = "com.farsitel.bazaar" ;
break;
case "myket" :
base64Key = "==5AMP1E8A5E64KE7==" ;
bindURL = "ir.mservices.market.InAppBillingService.BIND" ;
packageURL = "ir.mservices.market" ;
break;
case "cando" :
base64Key = "==5AMP1E8A5E64KE7==" ;
bindURL = "com.ada.market.service.payment.BIND" ;
packageURL = "com.ada.market" ;
break;
default:
trace( "BillingManager ::: market name[" + _marketName + "] is invalid." );
break;
}
Iab . instance . addEventListener (IabEvent . SETUP_FINISHED , iabSetupFinishedHandler) ;
Iab . instance . startSetup(base64Key, bindURL, package URL);
...
function iabSetupFinishedHandler(event : IabEvent) : void {
trace( "BillingManager ::: iabSetupFinishedHandler" , event.result.message);
Iab.instance.removeEventListener(IabEvent.SETUP_FINISHED, iabSetupFinishedHandler);
queryInventory();
}有時,用戶無法完成購買流量導致網絡問題或其他致命錯誤。初始化後,您可以還原項目以更好地體驗。
/**Getting purchased product details, Iab should be initialized first</br>
* if put items args getting purchased and not purchased product details
*/
function queryInventory() : void {
//restoring purchased in-app items and subscriptions
Iab.instance.addEventListener(IabEvent.QUERY_INVENTORY_FINISHED, iabQueryInventoryFinishedHandler);
Iab.instance.queryInventory();
}
...
function iabQueryInventoryFinishedHandler(event : IabEvent) : void {
Iab.instance.removeEventListener(IabEvent.QUERY_INVENTORY_FINISHED, iabQueryInventoryFinishedHandler);
if ( !event.result.succeed ) {
trace ( "iabQueryInventoryFinishedHandler failed to finish." ) ;
return ;
}
// consume all consumable items
/*for each(var k:String in _items) {
var purchase:Purchase = Iab.instance.getPurchase(k);
if( purchase == null || purchase.itemType == Iab.ITEM_TYPE_SUBS )
continue;
consume(purchase.sku);
}*/
}用戶點擊或單擊“購買”按鈕呼叫購買方法時。不要忘記為購買該商品的購買。
對於可消耗品,您應該在收購以聽眾方法完成後立即食用物品。
// making the purchase, Iab should be initialized first
Iab . instance . addEventListener (IabEvent . PURCHASE_FINISHED , iabPurchaseFinishedHandler) ;
Iab . instance . purchase(sku, Iab . ITEM_TYPE_INAPP , payload) ;
...
function iabPurchaseFinishedHandler(event : IabEvent) : void {
trace( "BillingManager ::: iabPurchaseFinishedHandler" , event.result.message);
Iab.instance.removeEventListener(IabEvent.PURCHASE_FINISHED, iabPurchaseFinishedHandler);
if (!event.result.succeed) {
trace (event . result . response, event . result . message ) ;
return ;
}
var purchase:Purchase = Iab.instance.getPurchase(event.result.purchase.sku);
if( purchase == null )
queryInventory();
else // if you want immediatly consume after purchase
consume(purchase.sku);
}對於不需要的項目,不需要使用此方法。
function consume(sku : String ) : void {
trace( "BillingManager ::: consume" , sku);
Iab.instance.addEventListener(IabEvent.CONSUME_FINISHED, iabConsumeFinishedHandler);
Iab.instance.consume(sku);
}
function iabConsumeFinishedHandler(event : IabEvent) : void {
trace( "BillingManager ::: iabConsumeFinishedHandler" , event.result.message);
Iab.instance.removeEventListener(IabEvent.CONSUME_FINISHED, iabConsumeFinishedHandler);
if (!event.result.succeed) {
trace ( "iabConsumeFinishedHandler failed to consume:" , event . result . message ) ;
return ;
}
}根據選定的市場添加計費權限,將以下幾行添加到您的空氣aplication-app.xml文件<SustAdditions>中
<!-- In APP Billing permissions -->
< uses-permission android : name = " android.permission.INTERNET " />
<!-- For Google --> < uses-permission android : name = " com.android.vending.BILLING " />
<!-- For CafeBazaar --> <!-- <uses-permission android:name="com.farsitel.bazaar.permission.PAY_THROUGH_BAZAAR" /> -->
<!-- For Myket --> <!-- <uses-permission android:name="ir.mservices.market.BILLING" /> -->
< application android : enabled = " true " >
< activity android : name = " com.gerantech.extensions.IabActivity "
android : theme = " @android:style/Theme.Translucent.NoTitleBar.Fullscreen "
android : background = " #30000000 "
android : screenOrientation = " portrait "
android : configChanges = " orientation|keyboardHidden " />
</ application >添加擴展ID擴展ID:com.gerantech.extensions.ibilling
< extensions >
< extensionID >com.gerantech.extensions.iabilling</ extensionID >
</ extensions >http://developer.android.com/google/play/billing/billing_testing.html
ANE為AIR建造18.0+,以重建另一個版本,請執行以下操作: