日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

air应用接入移动mm弱联网平台

發布時間:2023/12/18 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 air应用接入移动mm弱联网平台 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

不得不說移動mm平臺是比較友好的,遇到的所有問題都在群里有人回答,并且sdk接入十分方便,沒有遇到什么大問題。

工作量大概是一天左右,分享一下接入過程。


所需環境:

AIR:3.9

ANDROIDAPI:19

移動mm版本:1.2.2


1.編寫as文件


定義函數常量

private static const MM_FUNCTION_INIT:String = "mmsns_function_init";//與java端中Map里的key一致 private static const MM_FUNCTION_BILL:String = "mmsns_function_bill";//與java端中Map里的key一致 private static const MM_FUNCTION_DEBUG:String = "mmsns_function_debug";//與java端中Map里的key一致 private static const EXTENSION_ID:String = "com.mmsns.ane";//與extension.xml中的id標簽一致


創建單例
private static var _instance:MMSNSExtension; public function MMSNSExtension() {if(extContext == null) {extContext = ExtensionContext.createExtensionContext(EXTENSION_ID, "");extContext.addEventListener(StatusEvent.STATUS, statusHandler);} } /*** 獲取實例* @return DLExtension 單例*/ public static function getInstance():MMSNSExtension { if(_instance == null)?{ _instance = new MMSNSExtension(); } return _instance; }


拋事件函數

/*** 轉拋事件* @param event 事件*/ private function statusHandler(event:StatusEvent):void {dispatchEvent(event); }
以上是99%的ane都需要復制粘貼的語句。。

然后是定義移動mm的函數,因為弱聯網版本只有初始化跟支付兩個功能點,所以直接寫

/*** 初始化* @param APPID* @param APPKEY* @return * */ public function MMSNSInit(APPID:String,APPKEY:String):void{if(extContext ){extContext.call(MM_FUNCTION_INIT, APPID, APPKEY);} } /*** 商品購買接口。* @param payCode* @param num* @param description* @return * */ public function MMSNSBilling(payCode:String, num:uint, description:String = ''):void{if(extContext ){extContext.call(MM_FUNCTION_BILL, payCode, num, description);} }
以上,as版本真心沒技術含量,請大家諒解。


然后是安卓端。。

安卓端我的api一律設為19,然后記得勾上"Mark this project as a library",上面兩項都去掉勾

安卓端要先創建context跟extension兩個文件,把入口代碼站過去。


Context文件

package com.mmsns.ane;import java.util.HashMap; import java.util.Map;import com.adobe.fre.FREContext; import com.adobe.fre.FREFunction; import com.mmsns.func.MMSNSBill; import com.mmsns.func.MMSNSBillInit;public class MMSNSContext extends FREContext {/*** 初始化*/public static final String MMSNS_FUNCTION_INIT = "mmsns_function_init";/*** 訂購*/public static final String MMSNS_FUNCTION_BILL = "mmsns_function_bill";@Overridepublic void dispose() {// TODO Auto-generated method stub}@Overridepublic Map<String, FREFunction> getFunctions() {// TODO Auto-generated method stubMap<String, FREFunction> map = new HashMap<String, FREFunction>();//映射map.put(MMSNS_FUNCTION_INIT, new MMSNSBillInit());map.put(MMSNS_FUNCTION_BILL, new MMSNSBill());return map;}}
Extension文件

package com.mmsns.ane;import com.adobe.fre.FREContext; import com.adobe.fre.FREExtension;public class MMSNSExtension implements FREExtension {@Overridepublic FREContext createContext(String arg0) {// TODO Auto-generated method stubreturn new MMSNSContext();}@Overridepublic void dispose() {// TODO Auto-generated method stub}@Overridepublic void initialize() {// TODO Auto-generated method stub}}
把入口定義好后,就是加入功能代碼了,因為要完成移動mm的支付,需要完成Handler和OnSMSPurchaseListener這兩個類來監測初始化跟支付的狀態。


IAPHandler

package com.mmsns.func;import android.os.Handler; import android.os.Message;import com.adobe.fre.FREContext;public class IAPHandler extends Handler {public static final int INIT_FINISH = 10000;public static final int BILL_FINISH = 10001;public static final int QUERY_FINISH = 10002;public static final int UNSUB_FINISH = 10003;public IAPHandler(FREContext context) {MMSNSShared.context = (FREContext) context;}@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);} }
IAPListener,處理各種完成的回調之類的,拋送信息到as端

package com.mmsns.func;import java.util.HashMap;import mm.sms.purchasesdk.OnSMSPurchaseListener; import mm.sms.purchasesdk.PurchaseCode; import mm.sms.purchasesdk.SMSPurchase; import android.os.Message; import android.util.Log;import com.adobe.fre.FREContext;public class IAPListener implements OnSMSPurchaseListener {private final String TAG = "IAPListener";private IAPHandler iapHandler;public IAPListener(FREContext context, IAPHandler iapHandler) {MMSNSShared.context = context;this.iapHandler = iapHandler;}@Overridepublic void onInitFinish(int code) {MMSNSShared.event(TAG, "Init finish, status code = " + code);Message message = iapHandler.obtainMessage(IAPHandler.INIT_FINISH);String result = "初始化結果:" + SMSPurchase.getReason(code);message.obj = result;message.sendToTarget();}@Overridepublic void onBillingFinish(int code, HashMap arg1) {MMSNSShared.event(TAG, "billing finish, status code = " + code);String result = "訂購成功";Message message = iapHandler.obtainMessage(IAPHandler.BILL_FINISH);// 商品信息String paycode = null;// 商品的交易 ID,用戶可以根據這個交易ID,查詢商品是否已經交易String tradeID = null;if (code == PurchaseCode.ORDER_OK|| code == PurchaseCode.ORDER_OK_TIMEOUT) {/*** 商品購買成功或者已經購買。 此時會返回商品的paycode,orderID,以及剩余時間(租賃類型商品)*/if (arg1 != null) {paycode = (String) arg1.get(OnSMSPurchaseListener.PAYCODE);if (paycode != null && paycode.trim().length() != 0) {result = result + ",Paycode:" + paycode;}tradeID = (String) arg1.get(OnSMSPurchaseListener.TRADEID);if (tradeID != null && tradeID.trim().length() != 0) {result = result + ",tradeid:" + tradeID;}MMSNSShared.event("ORDER_SUCCESS", paycode);}} else {/*** 表示訂購失敗。*/result = "訂購失敗:" + SMSPurchase.getReason(code);MMSNSShared.event("ORDER_FAIL", SMSPurchase.getReason(code));Log.d(TAG, "ORDER_FAIL" + SMSPurchase.getReason(code));}MMSNSShared.event(TAG, result);} }
好了,現在可以開始寫功能函數了,但是我們需要一個共享的類來存儲context和一些初始信息,方便我們隨時調用。

于是來一個Shared類,專門存儲信息

package com.mmsns.func;import mm.sms.purchasesdk.SMSPurchase;import android.util.Log; import android.widget.Toast;import com.adobe.fre.FREContext;public class MMSNSShared {public static Boolean DEBUG = false;public static String APPID = "0000000000";public static String APPKEY = "0000000000";public static SMSPurchase purchase;public static IAPListener mListener;public static FREContext context;public static void event(String code,String level ){Log.d(code, "---------拋出event-------" + ":"+level );context.dispatchStatusEventAsync(code, level );if (DEBUG){Toast.makeText(context.getActivity(), code + ":" + level, Toast.LENGTH_LONG).show();}} }
現在實現初始化mm模塊

package com.mmsns.func;import mm.sms.purchasesdk.SMSPurchase;import com.adobe.fre.FREContext; import com.adobe.fre.FREFunction; import com.adobe.fre.FREObject;public class MMSNSBillInit implements FREFunction {private String TAG = "MMBillInit";@Overridepublic FREObject call(final FREContext context, FREObject[] arg1) {MMSNSShared.context = context;FREObject result = null; try{MMSNSShared.APPID = arg1[0].getAsString();MMSNSShared.APPKEY = arg1[1].getAsString();}catch(Exception e){return null;}IAPHandler iapHandler = new IAPHandler(MMSNSShared.context);/*** IAP組件初始化.包括下面3步。*//*** step1.實例化PurchaseListener。實例化傳入的參數與您實現PurchaseListener接口的對象有關。* 例如,此Demo代碼中使用IAPListener繼承PurchaseListener,其構造函數需要Context實例。*/MMSNSShared.mListener = new IAPListener(MMSNSShared.context, iapHandler);/*** step2.獲取Purchase實例。*/MMSNSShared.purchase = SMSPurchase.getInstance();/*** step3.向Purhase傳入應用信息。APPID,APPKEY。 需要傳入參數APPID,APPKEY。 APPID,見開發者文檔* APPKEY,見開發者文檔*/try {MMSNSShared.purchase.setAppInfo(MMSNSShared.APPID, MMSNSShared.APPKEY);} catch (Exception e1) {return null;}/*** step4. IAP組件初始化開始, 參數PurchaseListener,初始化函數需傳入step1時實例化的* PurchaseListener。*/try {MMSNSShared.purchase.smsInit(context.getActivity(), MMSNSShared.mListener); } catch (Exception e) {return null;}//--------------------------------return result;} }
然后是支付函數

package com.mmsns.func;import android.content.Context;import com.adobe.fre.FREContext; import com.adobe.fre.FREFunction; import com.adobe.fre.FREObject;public class MMSNSBill implements FREFunction {private String TAG = "MMSNSBill";@Overridepublic FREObject call(final FREContext context, FREObject[] arg1) {String payCode = null,description = null;int num = 0;FREObject result = null; //get paramstry{payCode = arg1[0].getAsString();num = arg1[1].getAsInt();description = arg1[2].getAsString();}catch(Exception e){MMSNSShared.event(TAG, "參數錯誤:" + e.getMessage() + "|" + payCode + "|" + num + description);return null;}/*** 商品購買接口。*/if(MMSNSShared.context != null){order(MMSNSShared.context.getActivity(), payCode, num, description);}else{}//--------------------------------return result;}public void order(Context context, String payCode, int num, String description) {try {MMSNSShared.purchase.smsOrder(context, payCode, MMSNSShared.mListener, description);} catch (Exception e) {MMSNSShared.event(TAG, "支付失敗" + e.getMessage() + "," + e.toString());}}}
好了,程序上的東西都做好了,現在開始打包ane

我們需要as端bin文件夾下的swc文件,和and端bin文件夾下的jar文件

以及一個extension.xml的文件

<?xml version="1.0" encoding="UTF-8"?> <extension xmlns="http://ns.adobe.com/air/extension/3.9"><id>com.mmsns.ane</id><versionNumber>1</versionNumber><platforms><platform name="Android-ARM"><applicationDeployment><nativeLibrary>mmsnsbillingane.jar</nativeLibrary><initializer>com.mmsns.ane.MMSNSExtension</initializer><finalizer>com.mmsns.ane.MMSNSExtension</finalizer></applicationDeployment></platform></platforms> </extension>


先要合并生成的jar跟移動的jar文件

用winrar之類的打開自己的jar和移動mm的jar,把移動mm的除了assets和META-INF外都復制到自己的jar文件那

我是使用批處理完成這個復雜的操作。。感謝前人的努力寫出這段神奇的批處理

rem 你做的主JAR包的路徑 set SOURCEJAR=com.mmsns.ane.jar set MainJar=mmsnsbillingane.jar rem 第三方JAR包的路徑 set ExternalJar=mmsmsbilling1.2.2.jar rem 第三方JAR包頂級包名稱 set packageName=com set packageName2=mm rem swc文件名 set SWC=MMANE-SNS.swc echo =========== start make jar ============== rem 創建臨時目錄 md temp rem 拷貝臨時文件 rem copy %SOURCEJAR% %MainJar% copy .\android-project\bin\%SOURCEJAR% .\temp\%MainJar% >nul copy .\SDK1.2.2\libs\%ExternalJar% .\temp\ >nul cd temp rem 解壓第三方包 jar -xf %ExternalJar% rem 合并主JAR包 jar -uf %MainJar% %packageName% rem 合并其他頂級包 jar -uf %MainJar% %packageName2%

然后把生成的jar,swc解壓出來的catalog.xml,library.swf,一起扔到android-ARM文件夾里,把swc,extension.xml,p12放到外面

移動mm提供的libsmsiap.so,需要放到android-ARM/libs/armeabi-v7a下面


用一行命令打包,其中p12用自己的p12文件
set FLEX_SDK=D:\AIR_3.9 java -jar "%FLEX_SDK%\lib\adt.jar" -package -storetype PKCS12 -keystore czq.p12 -storepass 123456 -target ane com.mmsns.ane extension.xml -swc *.swc -platform Android-ARM -C Android-ARM mmiap .
搞定。。

另外打包apk的時候,記得把移動mm的jar包里的assets\mmiap打包進你的apk。

我還做了個一件打包生成ane的自動化批處理文件,包含在源碼里面。

本教程的所有代碼以及打包函數都在這里。


https://github.com/platformanes/android-mm-sms


第一篇文章,請拍磚。感謝Rect的先期研究。接下來我會放出小米還有移動mm平臺,以及我接過的一些ios平臺的教程。有些rect的版本改動不大的我就不放出來了,請自己到https://github.com/platformanes去下載。

希望使用air的人能更專注于開發游戲上面,而不要在ane接入上耗費太多時間。

總結

以上是生活随笔為你收集整理的air应用接入移动mm弱联网平台的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。