Android 应用内计费 v3:“无法执行操作:queryInventory”

2024-03-24

我第一次使用新的 v3 API 设置应用内结算。它在我的设备上运行正常,但我收到了其他用户的很多错误报告。

其中之一是:

java.lang.IllegalStateException: IAB helper is not set up. Can't perform operation: queryInventory
    at my.package.util.iab.IabHelper.checkSetupDone(IabHelper.java:673)
    at my.package.util.iab.IabHelper.queryInventory(IabHelper.java:462)
    at my.package.util.iab.IabHelper$2.run(IabHelper.java:521)
    at java.lang.Thread.run(Thread.java:1019)

另一种是:

java.lang.NullPointerException
    at my.package.activities.MainActivity$4.onIabSetupFinished(MainActivity.java:159)
    at my.package.util.iab.IabHelper$1.onServiceConnected(IabHelper.java:242)

我的活动实现遵循 Google 的示例代码(示例中所有引用的类均未受影响):

IabHelper mHelper;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //...

    mHelper = new IabHelper(this, IAB_PUBLIC_KEY);
    mHelper.enableDebugLogging(true);

    mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
        public void onIabSetupFinished(IabResult result) {
            if (!result.isSuccess()) {
                // Oh noes, there was a problem.
                return;
            }

            // Hooray, IAB is fully set up. Now, let's get an inventory of
            // stuff we own.
            mHelper.queryInventoryAsync(mGotInventoryListener); //***(1)***
        }
    });
}

// Listener that's called when we finish querying the items we own
IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
    public void onQueryInventoryFinished(IabResult result,
            Inventory inventory) {
        if (!result.isFailure()) {
            if (inventory.hasPurchase(SoundsGlobals.IAB_SKU_PREMIUM)){
                //we are premium, do things
            }
        }
        else{
            //oops
        }
    }
};

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

我假设这两个错误都源自标记为的行***(1)***

造成这些错误的原因是什么?如果我打电话queryInventoryAsync仅在之内onIabSetupFinished,怎么可能mHelper为空,或者mHelper是不是设置了?

有谁知道这个问题的解决方案吗?


正如 @Martin 所解释的,Google 应用内结算示例中存在一个错误,导致了这种情况。

但是,修复后,我仍然在内部调用中收到一些错误(queryInventory在创建的线程内queryInventoryAsync在极少数情况下,报告称未设置助手)。我通过在这种情况下添加额外的捕获来解决这个问题:

try {
    inv = queryInventory(querySkuDetails, moreSkus);
}
catch (IabException ex) {
    result = ex.getResult();
}
catch(IllegalStateException ex){ //ADDED THIS CATCH
    result = new IabResult(BILLING_RESPONSE_RESULT_ERROR, "Helper is not setup.");
}

我也遇到了崩溃mHelper.dispose()我以类似的方式修复了它:

try{
    if (mContext != null) mContext.unbindService(mServiceConn);
}
catch(IllegalArgumentException ex){ //ADDED THIS CATCH
    //IGNORE IT - somehow, the service was already unregistered
}

当然,您可以将它们默默地记录到 ACRA,而不是忽略这些错误,例如:)

谢谢你们的评论。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 应用内计费 v3:“无法执行操作:queryInventory” 的相关文章

  • 如何更改Appcompat主题中的TimePicker线条颜色?

    如何更改 Appcompat 主题中所选数字之间的 TimePicker 线条颜色 线条是蓝色的 但我需要橙色线条 我将 TimePickerDialog 与 ContextThemeWrapper 一起使用 TimePickerDialo
  • 您的手机中未安装应用程序

    我在模拟器中运行该应用程序 它成功运行 并且应用程序的图标显示在模拟器菜单中 但是当我尝试从模拟器菜单再次运行该应用程序时 它不允许我从中运行并显示 Toast 您的手机中未安装应用程序 在图像中 红色圆形是我的应用程序图标 如果您有您的M
  • Moshi 无法解析 nullable

    你好 希望你能帮助我 使用 kotlin Retrofit2 moshi 我从 https api spacexdata com v3 launches 获取数据并解析它 一切都很顺利 我得到的属性如下 flight number miss
  • onScale 和 Canvas - 缩放图像后如何调整原点?

    我有一个非常简单的测试应用程序 带有自定义组件MyView java https github com afarber android newbie blob master TestScroll src de afarber testscr
  • 如何在android中使用retrofit访问404错误?

    我正在使用改造 2 访问 REST API 以使用原始正文插入 JSON 数据 我从服务器获得成功响应 但在响应时收到 404 错误 我想访问404错误请帮我解决这个问题 ApiUtil getServiceClass sendFinalC
  • 将网页保存到android中的webview缓存中

    我正在创建一个应用程序 它将从互联网下载一些网页 并在用户单击按钮时将它们保存到缓存 并在没有互联网可用时加载它们 当我运行代码时 出现空指针异常 我已在清单文件中添加了所有必要的权限 public class MainActivity e
  • 每当调用 startactivityforresult 时 Android 就会终止我的应用程序

    好吧 在我的应用程序中 我使用 Android 的默认相机和图库 startActivityforResult 为 Intent i new Intent android intent action PICK MediaStore Imag
  • 如何在android 4.2中显示选项菜单

    我正在尝试在我的测试应用程序中创建菜单选项 当我将清单中的主题设置为默认时 我可以看到菜单 菜单显示在顶部 如果我将清单中的主题设置为 NoTitleBar 我看不到菜单选项 我想在清单中设置主题 NoTitleBar 时获取菜单 如何修复
  • 如何修复第三方 SDK 中重复的 libgnustl_shared.so 文件?

    当我使用 gradle 构建并运行 apk 时 出现以下错误 Error Execution failed for task app transformNative libsWithMergeJniLibsForDebug gt com a
  • 将可渲染节点(相同的旋转、位置和比例)替换为 Sceneform sdk 中的另一个可渲染节点

    我是 Android 版 sceneform sdk 的新手 我已经添加了一个Transformable Node 然后我应用了一些旋转 缩放并改变了它的位置 现在 单击按钮后 我需要放置具有相同旋转 缩放和位置的第二个节点 为此我所做的是
  • Android 中表与游标的并集

    我正在尝试将两个具有相同字段的表合并起来 通过内容提供程序 创建一个用于创建 ListView 的游标 Override public Cursor query Uri uri String projection String select
  • 从 JSON 数组创建标记 php mySQL Google Maps v2 android

    我正在尝试从 mySQL 数据库在 Google Maps v2 上创建标记 但它不起作用 地图确实出现了 但没有标记 谁能告诉我出了什么问题以及我需要改变什么 我也尝试过让 getDouble 为 getDouble 0 和 getDou
  • 点击按钮时的 Admob 插页式广告

    我有一个应用程序 我正在使用 admob 横幅 现在我想在点击按钮时显示插页式广告 我的应用程序有 2 个活动 我想在第二个活动上显示插页式广告 第二个活动有一个返回第一个活动的按钮 我想在单击按钮后显示广告 我可以在单击按钮时显示广告 但
  • 短信管理器在少于 160 个字符时发送多部分消息

    我编写了一个使用短信管理器的应用程序 我用的方法sendTextMessage 但这行不通 现在我正在使用sendMutlipartTextMessage 这是工作 但当它大约 60 个字符时 它会发送多部分消息 这个是正常的 我读过的所有
  • 如何在按下硬件主页按钮时关闭所有活动?

    我有一个应用程序 其中有 5 个活动 一个菜单活动和另外 4 个子活动附加到菜单屏幕 所以我可以选择任何活动 然后返回菜单 假设我像这样四处走动 菜单 gt 活动 1 gt 菜单 gt 活动 3 gt 活动 2 gt 菜单 现在我按 主页
  • 无法获取 android.permission.CLEAR_APP_USER_DATA

    我正在开发需要特殊权限的系统应用程序 由于某种原因 我无法获得 CLEAR APP USER DATA 权限 但我可以使用 INSTALL PACKAGES DELETE PACKAGES 等 什么可能导致这种情况 显现 uses perm
  • 数字时钟不改变时间

    我正在开发一个数字时钟小部件 我写了代码 但它没有更新时间 我没有使用任何服务并在模拟器中运行 我的代码如下 public class ExampleAppWidgetProvider extends AppWidgetProvider D
  • 加载 highchart 时 Android 错误膨胀类

    我正在尝试加载highcharts via Dialog 下面是我的代码 Gradle implementation com highsoft highcharts highcharts 9 0 1 XML
  • Android PhoneGap 中的自定义字体

    我尝试为我的应用程序制作自定义字体 为此 我在 html 文件中编写了以下代码 在我的 HTML 正文中
  • 安装 APK 时出现会话“应用程序”错误

    我在将 Android Studio 1 1 编写的项目导入 Android Studio 2 1 2 时遇到困难 每当在平板电脑上测试应用程序之前构建 gradle 时 我都会收到此错误 下面是错误的屏幕截图 有谁知道是什么问题 我尝试过

随机推荐

  • UDAF 与 Spark 中聚合器的性能比较

    我正在尝试在 Spark 中编写一些注重性能的代码 并想知道是否应该编写一个聚合器 https spark apache org docs latest api java org apache spark Aggregator html o
  • Haskell:代数数据与元组

    data Ray Ray Vector Vector or type Ray Vector Vector 在惯用的 Haskell 中哪个是首选 为什么我应该使用其中一种而不是另一种 我不关心表现 它似乎与功能没有什么区别 例如 trace
  • 使用 jax-rs 从 REST 服务下载 xml,无需本地存储文件

    在一项服务中 我正在创建一个名为 doc 的 XML 文档 并且希望用户收到下载该文档的提示 而不必将其保存在本地 如显示打开或保存文件的提示 但是 我无法找到应该如何构建将返回的响应 甚至无法找到 Produce 的类型 到目前为止我有这
  • 在 TCSH Shell 中启用历史记录

    如何启用在 tcsh shell 中输入的所有命令的日志记录 我试过了 将 history 变量设置为 100 savehist 到 99 将 histfile 设置为 home history 在 shell 中键入命令不会将命令保存在历
  • 让 gcc 警告隐式转换[重复]

    这个问题在这里已经有答案了 可能的重复 我可以让 GCC 在将太宽的类型传递给函数时发出警告吗 https stackoverflow com questions 310108 can i make gcc warn on passing
  • 从 Java (Scala) 调用 PHP 代码并获取结果

    这似乎在几个地方被问到 并被标记为 关闭 和 偏离主题 然而 人们似乎不断遇到这个问题 从java调用php方法 https stackoverflow com questions 614894 invoking a php method
  • 读/写简单 BMP 图像 C++

    我正在尝试读取简单的 BMP 文件 并且在不执行任何操作的情况下将其再次写回文件 我不知道读取文件或写回文件时出错在哪里 我在阅读和写作时添加了填充 文件读取 std vector
  • 使用 LINQ 获取一个 List<> 中不在另一个 List<> 中的项目

    我假设有一个简单的 LINQ 查询可以做到这一点 我只是不太确定如何做 鉴于这段代码 class Program static void Main string args List
  • jTable 中的 jButton 不可点击

    我遇到了问题 我无法单击按钮 它们的行为就像只是带有按钮设计的文本字段 my Main tableModStudents DefaultTableModel studentsTable getModel studentsTable getC
  • C# - 哪个更快:String.Contains() 或 Regex.isMatch()? [复制]

    这个问题在这里已经有答案了 可能的重复 Regex IsMatch 与 string Contains https stackoverflow com questions 2962670 regex ismatch vs string co
  • 为什么 System.out.print 会导致自动刷新?

    System out 是一个 PrintStream 对象 我阅读了有关 PrintStream 的文档 我不明白的是为什么 System out print 会导致缓冲区被刷新 这种情况不应该只发生在 println 中吗 这种情况不应该
  • IndexError:读取 python 的 CSV 文件中的列表索引超出范围

    我有一个包含 30000000 个条目的 csv 文件 像这样 3 2 2 2 2 2 2 当我尝试颠倒词序时 我收到以下错误 Traceback most recent call last File home grpus dg py li
  • 如何在 CodeIgniter 中创建库类的多个实例?

    我想在 CodeIgniter 中创建一个类的多个实例 我已将我的类创建为一个库 但无法弄清楚用于创建多个实例的语法 来自 CodeIgniter 用户指南 CI 用户指南 加载器类 http codeigniter com user gu
  • 将 puppeteer 与 imgui-js 结合使用

    如果问题的长度可能很吓人 问题的摘要是如何从节点服务器与前端应用程序交互 我相信 Puppeteer 的使用应该伴随着该请求的解决 问题很大 因为我解释了我在浏览器中实现后端代码 傀儡师 工作的所有失败尝试 除了构建和运行存储库之外 尽管按
  • Android Fragment 中的 EditText 值不刷新

    我正在使用Viewpager在 3 之间切换fragments 一切工作正常 除了第二个选项卡的刷新 或fragment 在这个选项卡中 我有一张图片 一些静态的Textviews 一些动态TextViews还有一些EditText fie
  • 如何生成 pool_transactions_genesis 和domain_transactions_genesis?

    我正在尝试创建 Hyperledger Indy 网络 并且一直在遵循阅读文档 https hyperledger indy readthedocs io projects node en latest start nodes html 我
  • 在 SQL 中的 CAST 中使用 & 符号

    SQL Server 2005 上的以下代码片段在与号 上失败 select cast
  • 在两个片段之间拖放

    我正在研究用户界面上同时可见的两个不同片段之间的拖放操作 我想将视图从一个片段拖到另一个片段中 我可以在片段之间拖动它 但我面临的不好的是我无法在第二个片段上监听 onDrag 以获取第一个片段的视图 简而言之 第二个片段上的 OnDrag
  • 如何将 Play 与自定义模块和持续集成结合使用

    如何在 CI 系统中设置 Play 应用程序和 自定义 Play 模块的构建 以便当模块的构建良好时 构建会将模块工件安装在本地存储库中和 或将它们部署到远程存储库 并且应用程序使用该存储库中的工件 该解决方案也应该适合在本地工作的开发人员
  • Android 应用内计费 v3:“无法执行操作:queryInventory”

    我第一次使用新的 v3 API 设置应用内结算 它在我的设备上运行正常 但我收到了其他用户的很多错误报告 其中之一是 java lang IllegalStateException IAB helper is not set up Can