使用版本3的Android应用程序计费 - onIabPurchaseFinished永远不会被调用

时间:2014-11-03 02:44:07

标签: android in-app-billing

看过这个链接:
onIabPurchaseFinished never called.
     和.... 我已经查看了以下链接 - 这是我面临的确切问题:
IabHelper PurchaseFinishedListener

' kevinl '在上面第二个链接的答案之一 - 是我的问题,即 我有' onActivityResult '在我的活动中编码
控件确实进入了这种方法 - 但是 - 它确实转到 - onIabPurchaseFinished

我正在调用购买流程如下:

public void onClickIap(View v) {


    if(isAlreadyPurchased){
        Log.d(TAG, "In onClickIap >>> The app is purchased ");
    }else{
        Log.d(TAG, "In onClickIap >>> The app is NOT purchased: ");

        /** we need to check if this item was purchased from google store details **/
        /** makes synchronous call -return control to callback method in listener **/
        /** this is the heart of in app - where all the activity starts **/
        mHelper.launchPurchaseFlow(this, ITEM_SKU_TEST_4, 10001,mPurchaseFinishedListener, "mypurchasetoken");

        mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
            public void onIabPurchaseFinished(IabResult result, Purchase purchase){
                Log.d(TAG, "In onIabPurchaseFinished  ");                   
                if (result.isFailure()) {
                    Log.d(TAG, "In onIabPurchaseFinished  >>> purchase error ");
                    return;
                }else if (purchase.getSku().equals(ITEM_SKU_TEST_4)) {
                    Log.d(TAG, "In onIabPurchaseFinished  purchase success ");

                    /**TODO update the db **/
                    DbClass dbDbClass = new DbClass(getApplicationContext());
                    dbHelper.updatePurchasedQuiz(2);
                    /** set the flag **/
                    isAlreadyPurchased = true;

                    Log.d(TAG, "The app after all the shebang: ");
                    Intent intent = new Intent(getApplicationContext(),ExamActivity.class);
                    intent.putExtra("quizId", "2");
                    startActivity(intent);          
                }else{
                    Log.d(TAG, " ");
                    Log.d(TAG, "In onIabPurchaseFinished  in a weird condition  ");             
                }
            }               
        };          
    }       
}

我的 onActivityResult 的实现(我可以看到调试日志)

protected void onActivityResult(int requestCode, int resultCode, Intent data) {     
    Log.d(TAG, " ");
    Log.d(TAG, "<<<<<< in IAP ONACTIVITYRESULT >>>>>>");
    Log.d(TAG, "onActivityResult " + requestCode + "," + resultCode + "," + data);
    if (!mHelper.handleActivityResult(requestCode, resultCode, data)) {
        super.onActivityResult(requestCode, resultCode, data);
    }
}   

不知道这是否是原因,但我调用/初始化mHelper的方式是:

  

1在我的活动onCreate中 - 我开始一个线程(AsyncTask)
  2在方法 - doInBackground中 - 我正在初始化这个帮助器:

mHelper = new IabHelper(ExamHomeActivity.this, base64EncodedPublicKey);
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { .... }
  

3然后当这个异步任务完成时 - 我在屏幕上显示一些按钮
  4单击任何按钮将调用上述方法 - onClickIap

感谢
香卡

1 个答案:

答案 0 :(得分:1)

在初始化之前传递mPurchaseFinishedListener(在调用launchPurchaseFlow之后就会发生这种情况)。

另外,在onClick中初始化监听器不是一个好主意。每次按下按钮,您都会这样做。从onClickIap()方法中取出它。

你可以在你的活动中静态地执行此操作,就像在Google的示例应用程序Trivial Drive中一样:

IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
            public void onIabPurchaseFinished(IabResult result, Purchase purchase){
                Log.d(TAG, "In onIabPurchaseFinished  ");                   
                ...
                ...
                ...
            }               
        };    

初始化IabHelper可能最好在活动的onCreate()中完成:

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_subscribe);

        mHelper = new IabHelper(this);
}

然后不要忘记在onDestory()中处理它:

 @Override
    protected void onDestroy() {
        super.onDestroy();
        // very important:
        if (mHelper != null) {
            mHelper.dispose();
            mHelper = null;
        }
    }

此外,无需从后台线程设置IabHelper。只要你准备好,就从你的UI线程中调用mHelper.startSetup。