3

私はいくつかの関連する質問を見ましたが、私が持っている特定の問題に焦点を当てたものはありません:

PayPalMPLライブラリを使用しています。

PayPalPaymentオブジェクトを作成してから、チェックアウトを実行するためのアクティビティを作成します。それはうまくいきます。私の問題は、ResultDelegateで、支払い後に発生し、いくつかの変更(SharedPreferencesの保存など)を行うアクティビティから関数を呼び出す必要があることです。

だからこのようなもの:

public class ResultDelegate implements PayPalResultDelegate, Serializable {
    public void onPaymentSucceeded(String payKey, String paymentStatus) {
        System.out.println("SUCCESS, You have successfully completed your transaction.");
        System.out.println("PayKey: "+payKey);
        System.out.println("PayStatus: "+paymentStatus);

        callMyCustomAfterPaymentFunction();
    }
    ...
}

さて、私は自分のアクティビティを受け入れるResultDelegateのコンストラクターを作成しようとしました。私の既存のコードは次のとおりです。

//On the activity class
public class MainMenuActivity extends Activity {
    public void onCreate(Bundle savedInstanceState)
    {
        ...
        Button buy = (Button) findViewByID(R.id.buy_button);
        buy.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v)
            {
                new PurchaseTask(activity).execute();
            }
        }
    }
}

public class PurchaseTask extends AsyncTask <String, Void, String> {
    protected String doInBackground()
    {
        ...
        PayPal pp = PayPal.getInstance();
        CheckoutButton cb = pp.getCheckoutButton(...);
        cb.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v){
                ResultDelegate delegate = new ResultDelegate(myActivity);
                Intent checkout = PayPal.getInstance().checkout(paument, activity, delegate);
                activity.StartActivity(checkoutIntent);
            }
        }
    }
}

//On the ResultDelegate class

public class ResultDelegate implements PayPalResultDelegate, Serializable {
    private Activity myActivity;

    public void onPaymentSucceeded(String payKey, String paymentStatus) {
        System.out.println("SUCCESS, You have successfully completed your transaction.");
        System.out.println("PayKey: "+payKey);
        System.out.println("PayStatus: "+paymentStatus);

        myActivity.performAfterPaymentOperations();
    }
    ...
}

したがって、目標はResultDelegateからアクティビティ関数を呼び出すことです。または、さらに簡単に、ResultDelegate onPaymentSucceeded()が起動したときにSharedPreferenceの変更を保存できるようにします。

しかし、MyActivityフィールドがSerializableではないことを示すNotSerializableExceptionが発生します。

そのため、ResultDelegate内のアクティビティフィールドに一時的な識別子を追加しましたが、NullPointerExceptionが発生します。

4

3 に答える 3

3

Paypalモバイルチェックアウトガイド

ペイパルのウェブサイトで提供されている実装は、あなたのものとは異なります。彼らはstartActivityForResult()始めるためにやっていPaypalActivityます。そして、onActivityResult()メソッドにあるとき、彼らはstatusCodeトランザクションのステータスをチェックし、それに応じて行動することをチェックしています。

実装については、そのドキュメントに従ってください。

ここにあなたのコードで、私はを使用するためのポイントを見つけませんAsyncTask。あなたResultDelegateはそれが投げている理由ではないSerializableのです。ActivityNotSerializableException

編集:

Google Androidプラットフォーム向けに開発しているので、Google Checkoutアプリ内を使用してみませんか?

編集:

このメソッドは、PaypalActivity終了時に呼び出されます。resultCodeそのアクティビティはこのonActivityResultメソッドに渡されます。

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (resultCode) {
    case Activity.RESULT_OK:
        // The payment succeeded
        String payKey = data.getStringExtra(PayPalActivity.EXTRA_PAY_KEY);
        // Tell the user their payment succeeded
        break;
    case Activity.RESULT_CANCELED:
        // The payment was canceled
        // Tell the user their payment was canceled
        break;
    case PayPalActivity.RESULT_FAILURE:
        // The payment failed -- we get the error from the EXTRA_ERROR_ID
        // and EXTRA_ERROR_MESSAGE
        String errorID = data.getStringExtra(PayPalActivity.EXTRA_ERROR_ID);
        String errorMessage = data
                .getStringExtra(PayPalActivity.EXTRA_ERROR_MESSAGE);
        // Tell the user their payment was failed.
    }
}

よろしく、Aqif Hamid

于 2012-06-30T21:26:26.633 に答える
1

次のようなカスタムリスナーを作成できます。

カスタムリスナーを作成します:

  OnDoubleTap mListener;

    // Double tap custome listenre to edit photoes
    public interface OnDoubleTap {
        public void onEvent(Uri imgPath, int mPos);

    }

    public void setDoubleTapListener(OnDoubleTap eventListener) {
        mListener = eventListener;

    }

今、あなたがこのように望むところならどこでもこれを呼んでください:

mListener.onEvent(Uri, 1));

これで、このリスナーを呼び出すたびに、このリスナーを次のように使用するアクティビティで起動します。

myCanvas.setDoubleTapListener(new OnDoubleTap() {

        @Override
        public void onEvent(Uri imgPath, int Pos) {
            // TODO Auto-generated method stub
            Toast.makeText(mContext, "LISTENER WORKING !!!", Toast.LENGTH_SHORT).show();

        }
    });

myCanvasは、リスナーを作成するクラスのオブジェクトです。

于 2012-07-04T12:16:20.807 に答える
0

このソリューションを試してください:

PayPalPayment thingToBuy = new PayPalPayment(new BigDecimal(price),getResources().getString(R.string.curruncy_code), getResources().getString(R.string.app_name),
                    PayPalPayment.PAYMENT_INTENT_SALE);
            Intent intent = new Intent(CreateEventStep4.this, PaymentActivity.class);
            intent.putExtra(PaymentActivity.EXTRA_PAYMENT, thingToBuy);
            startActivityForResult(intent, REQUEST_PAYPAL_PAYMENT);

PaymentConfirmation confirm = data.getParcelableExtra(PaymentActivity.EXTRA_RESULT_CONFIRMATION);
            if (confirm != null) {
                try {

                    Log.e("paymentExample", confirm.toJSONObject().toString());


                    JSONObject jsonObj=new JSONObject(confirm.toJSONObject().toString());

                    String paymentId=jsonObj.getJSONObject("response").getString("id");
                    System.out.println("payment id:-=="+paymentId);

                    screenShotFile = takeScreenshot(frmTemplate);
                    uploadImage(myEvent.getEvent_id(),screenShotFile);

                } catch (JSONException e) {
                    Log.e("paymentExample", "an extremely unlikely failure occurred: ", e);
                }
于 2016-07-22T12:42:12.613 に答える