2

Appcelerator で新しい Square API for Android 用のカスタム モジュールを作成しようとしています。私は思い通りにすべてを持っていますが、主な問題は、支払いが失敗した場合に、支払いが成功したことを発信者に通知できるようにしたいということです。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!';
});
4

1 に答える 1

4

この質問に出くわした人のために。答えはモジュールにあります: https://github.com/hidef/Appcelerator-Square-Module (LaunchSquare.java クラスを参照)

基本的に、Square API の onResult 更新を受け取るために作成した Activity オブジェクトを使用しました。その後、それをモジュール クラスにきれいに戻し、コールバックを介して呼び出し元のアプリケーションに戻すことができました。

于 2011-03-11T05:26:25.667 に答える