2011-03-07 33 views
2

我想在Appcelerator中为Android的新Square API创建一个自定义模块。我拥有所有我想要的方式,但主要问题是我希望能够通知呼叫方,如果支付失败,支付是成功的。 Square API说:Appcelerator自定义模块接收onActivityResult回调

在Square完成后,Android会在传递给构造函数的Activity上调用Activity.onActivityResult()。传递给此方法的请求代码将传递给onActivityResult()。如果付款被取消,结果代码为Activity.RESULT_CANCELED;如果付款成功,结果代码为Activity.RESULT_OK。

我一直在传递TiContext.currentActivity的构造器:

public SquareModule(TiContext tiContext) { 
    super(tiContext); 

    ourSquare = new Square(tiContext.getActivity()); 
} 

然后在实际运行支付方式,我有这个基本上尝试设置在回调传递给当前活动的onResult处理程序使用TiActivitySupportHelper类中的registerResultHandler。

public void runPayment(KrollInvocation invocation, int price, String description, KrollCallback handler) { 
     Log.i(LCAT, "runPayment called"); 

     // Register the passed in function as a handler on the onResult stack 

     this.resultCallback = handler; 
     Activity activity = invocation.getTiContext().getActivity(); 
     TiActivitySupportHelper support = new TiActivitySupportHelper(activity); 
     int code = support.getUniqueResultCode(); 
     support.registerResultHandler(code, this); 

       // Some of the payment work here 

     ourSquare.squareUp(Bill.containing(advice), code); 
    } 

主模块类实现TiActivityResultHandler并实现onResult和onError。这些方法根本没有被调用。当然,传入的方法也没有被调用。

为了完整起见,看到onResult和onError的处理程序执行:

@Override 
public void onResult(Activity activity, int requestCode, int resultCode, Intent data) 
{ 
    Log.i(LCAT, "onResult Called"); 
    if (resultCallback == null) return; 
    KrollDict event = new KrollDict(); 
    event.put(TiC.EVENT_PROPERTY_REQUEST_CODE, requestCode); 
    event.put(TiC.EVENT_PROPERTY_RESULT_CODE, resultCode); 
    event.put(TiC.EVENT_PROPERTY_INTENT, new IntentProxy(getTiContext(), data)); 
    event.put(TiC.EVENT_PROPERTY_SOURCE, this); 
    resultCallback.callAsync(event); 
} 

@Override 
public void onError(Activity activity, int requestCode, Exception e) 
{ 
    Log.i(LCAT, "onError Called"); 
    if (resultCallback == null) return; 
    KrollDict event = new KrollDict(); 
    event.put(TiC.EVENT_PROPERTY_REQUEST_CODE, requestCode); 
    event.put(TiC.EVENT_PROPERTY_ERROR, e.getMessage()); 
    event.put(TiC.EVENT_PROPERTY_SOURCE, this); 
    resultCallback.callAsync(event); 
} 

而且也看到了Appcelerator的JS调用模块中的方法:

square.runPayment(2, 'Testing123', function(e) { 
    label1.text = 'Payment Successful!'; 
}); 

回答

4

对于那些归到这题。答案可以在以下模块中找到: https://github.com/hidef/Appcelerator-Square-Module(请参阅LaunchSquare.java类)

基本上,我使用了一个我创建的Activity对象来接收Square API的onResult更新。然后,我可以将它传回给模块类,并通过回调将它传回给调用应用程序。