当前位置: 首页 > 知识库问答 >
问题:

使用版本3的android应用内计费-从未调用onIabPurchaseFinished

戴霖
2023-03-14

已经看过这个链接:
onIabPurchaseFinish从未打过电话。
和......我看了下面的链接,这就是我面临的确切问题:
IabHelper PurchaseFinishedListener

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

我调用购买流如下:

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在我的活动上创建-我启动一个线程(AsyncWG)
2在方法-doIn后台-我初始化这个助手:

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

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

谢谢
香卡

共有1个答案

通正平
2023-03-14

在初始化mPurchaseFinishedListener之前(在调用launchPurchaseFlow之后发生),您正在传递它。

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

您可以在活动中静态地执行此操作,就像在谷歌的示例应用程序Triple 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;
        }
    }

此外,不需要从后台线程设置IAB助手。打电话给mHelper。随时从UI线程启动安装。

 类似资料:
  • 我在我的开发分支apk上做了什么: > 添加了清单权限 添加了帐单代码来使用我的sku进行购买 我可能漏掉了什么?提前感谢!

  • 我在测试我的应用内计费时遇到了麻烦。 (使用Google Play应用内计费版本3 API) 问题: 已退款的应用程序内购买仍然存在于购买列表中,该列表由BillingClient.query购买()提供。 当我在一月份尝试退款时,退款的物品从购物清单上消失了。 我所做的: 作为测试人员购买了一些物品。 (我很确定对话框说是测试购买。) 之后在谷歌游戏控制台退款。 等到他们的付款状态变成退款。 清

  • 启动购买流后,onActivityResult方法需要什么? 来自平凡的驱动器示例: msgstr"在这里,您可以对与应用内计费无关的活动结果执行任何处理" 这是否意味着您需要更新用户的清单或显示警报框?如果是这样,我已经在OnConsumeFinishedListener中这样做了。我已经测试了我的代码,留下了上面的onActivityResult方法,看起来没问题。这可能会导致任何问题吗? 或

  • 好吧,在你们都冲我火冒三丈之前,我已经试过了互联网上所有其他的答案,但我仍然得到这个错误。 注意:我使用的是应用程序内的V3 API。 首先,我创建了应用内产品(我已经在控制台中有一个apk草稿文件)。 用SKU测试了我的应用程序,它运行良好,并将SKU改回了应用程序中的原始SKU。 我已经使用Eclipse的导出向导创建了签名apk。 已成功将签名的apk文件上载到我的Android控制台开发人

  • 新的Android Billing v3文档和帮助程序代码在启动购买流时使用。我想从开始一个购买流程(并接收结果)。 例如,文件建议致电 助手代码调用 它调用。 问题是,调用会导致在父上被调用,而不是在调用它的上(驻留的地方)。 我可以在父级中接收,然后手动调用上的,但是,有没有一种方法可以从

  • 当我的应用程序打开时,我想在google play上查看应用程序版本。如果应用程序的版本高于安装的应用程序,我想通知用户更新应用程序。我在这里发现了“android query”jar,在这里我无法动态检查版本,我想设置主要版本、次要版本或修订版本。谁能帮帮我怎么办? 提前谢谢