【问题标题】:android in app billing using version 3 - onIabPurchaseFinished never invokedandroid in app billing using version 3 - onIabPurchaseFinished 从未调用过
【发布时间】:2014-12-29 16:25:48
【问题描述】:

看过这个链接:
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

谢谢
香卡

【问题讨论】:

    标签: android in-app-billing


    【解决方案1】:

    您在初始化之前传递了 mPurchaseFinishedListener(这发生在您调用 launchPurchaseFlow 之后)。

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

    您可以在 Activity 中静态地执行此操作,就像在 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。

    【讨论】:

    • 非常感谢 - 我在调用 launchPurchaseFlow 之前先初始化了帮助程序 - mPurchaseFinishedListener,现在控件又回到了 onIabPurchaseFinished - 非常感谢 :)
    猜你喜欢
    • 2014-11-12
    • 2011-08-25
    • 2015-05-15
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多