繁体   English   中英

Appcelerator自定义模块接收onActivityResult的回调

[英]Appcelerator custom module receiving callback for onActivityResult

我正在尝试在Appcelerator中为Android的新Square API创建自定义模块。 我拥有自己想要的一切,但是主要的问题是我希望能够通知呼叫者付款成功,如果付款失败。 Square API表示:

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

我一直在将TiContext.currentActivity传递给构造函数:

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

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

然后在实际运行付款的方法中,我基本上使用TiActivitySupportHelper类中的registerResultHandler尝试将传入的回调设置为当前活动的onResult处理程序。

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

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

基本上,我使用创建的Activity对象来接收Square API的onResult更新。 然后,我可以将其干净地传递回模块类,并通过回调将其传递回调用的应用程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM