我想在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!';
});