应用内结算:“查询可供购买的商品”返回 0 件商品

2024-04-02

我正在尝试为我的应用程序实现应用内计费。
我正在关注 google 的 TriviaDrive 示例应用程序中使用的实现以及开发人员网站上的相关文档。
我的代码按预期工作,但是当我尝试“查询可购买商品” https://developer.android.com/training/in-app-billing/list-iab-products.html#QueryDetails,生成的 Inventory 对象包含 0 个对象,即使我已经创建了一个产品。

I have created a Managed Product with the id paid_version using the Google Play Developer Console, as shown in the image below: In-App Products - Screenshot

该文档指出“要检索产品详细信息,请致电queryInventoryAsync(boolean, List, QueryInventoryFinishedListener)在您的 IabHelper 实例上。”

在我自己的代码中我调用
mHelper.queryInventoryAsync(true, iabItemSkus, mQueryFinishedListener)
where:
mHelper是我的 IabHelper 实例
iabItemSkus是包含值为“paid_version”的单个项目的列表
mQueryFinishedListener是我的听众定义如下。

IabHelper.QueryInventoryFinishedListener mQueryFinishedListener = new IabHelper.QueryInventoryFinishedListener() {
        @Override
        public void onQueryInventoryFinished(IabResult result, Inventory inv) {
            if (result.isFailure()) {
                Log.d(TAG, "Querying Inventory Failed: " + result);
                return;
            }

            Log.d(TAG, "Title: " + inv.getSkuDetails(SKU_PAID).getTitle());
            Log.d(TAG, "Description: " + inv.getSkuDetails(SKU_PAID).getDescription());
            Log.d(TAG, "Price = " + inv.getSkuDetails(SKU_PAID).getPrice());
        }
    };

但在调试时我可以看到Inventory对象传回QueryInventoryFinishedListener包含 0 个项目,因此调用类似inv.getSkuDetails(SKU_PAID).getTitle()给出空指针异常。

我不知道我哪里错了。我本来期待着Inventory对象包含我的详细信息paid_version应用内产品。

下面只是我认为与此问题相关的代码和 LogCat 部分(尽量避免给您带来代码过载!),但如果代码其他部分的更多详细信息会有所帮助,请告诉我。

从我的活动来看:

...
private static final String SKU_PAID = "paid_version";
private static final String TAG = "MyActivity";
private IabHelper mHelper;
...

IabHelper.QueryInventoryFinishedListener mQueryFinishedListener = new IabHelper.QueryInventoryFinishedListener() {
    @Override
    public void onQueryInventoryFinished(IabResult result, Inventory inv) {
        if (result.isFailure()) {
            Log.d(TAG, "Querying Inventory Failed: " + result);
            return;
        }

        Log.d(TAG, "Title: " + inv.getSkuDetails(SKU_PAID).getTitle()); // <-- Line 266 of MyActivity.java
        Log.d(TAG, "Description: " + inv.getSkuDetails(SKU_PAID).getDescription());
        Log.d(TAG, "Price = " + inv.getSkuDetails(SKU_PAID).getPrice());
    }
};
...

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...

    final List<String> iabItemSkus = new ArrayList<String>();
    iabItemSkus.add(SKU_PAID);
    // In App Billing
    String base64EncodedPublicKey = "... My Public Key ...";
    mHelper = new IabHelper(this, base64EncodedPublicKey);
    mHelper.enableDebugLogging(true);
    mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
       @Override
       public void onIabSetupFinished(IabResult result) {
           if (!result.isSuccess()) {
               Log.d(TAG, "Problem setting up In-app Billing: " + result);
           }
           // Have we been disposed of in the meantime? If so, quit.
           if (mHelper == null) return;

           // IAB is fully set up. Now, let's get list of available items
           Log.d(TAG, "Setup successful. Querying inventory.");
           mHelper.queryInventoryAsync(true, iabItemSkus, mQueryFinishedListener);
       }
    });
    ...
}

来自我的 LogCat:

...
05-13 19:46:59.609  22390-22390/xxx.xxxxxx.xxxxxx D/IabHelper﹕ Starting in-app billing setup.
05-13 19:46:59.629  22390-22390/xxx.xxxxxx.xxxxxx D/IabHelper﹕ Billing service connected.
05-13 19:46:59.629  22390-22390/xxx.xxxxxx.xxxxxx D/IabHelper﹕ Checking for in-app billing 3 support.
05-13 19:46:59.629  22390-22390/xxx.xxxxxx.xxxxxx D/IabHelper﹕ In-app billing version 3 supported for xxx.xxxxxx.xxxxxx
05-13 19:46:59.639  22390-22390/xxx.xxxxxx.xxxxxx D/IabHelper﹕ Subscriptions AVAILABLE.
05-13 19:46:59.639  22390-22390/xxx.xxxxxx.xxxxxx D/MyActivity﹕ Setup successful. Querying inventory.
05-13 19:46:59.639  22390-22390/xxx.xxxxxx.xxxxxx D/IabHelper﹕ Starting async operation: refresh inventory
05-13 19:46:59.649  22390-22596/xxx.xxxxxx.xxxxxx D/IabHelper﹕ Querying owned items, item type: inapp
05-13 19:46:59.649  22390-22596/xxx.xxxxxx.xxxxxx D/IabHelper﹕ Package name: xxx.xxxxxx.xxxxxx
05-13 19:46:59.649  22390-22596/xxx.xxxxxx.xxxxxx D/IabHelper﹕ Calling getPurchases with continuation token: null
05-13 19:46:59.659  22390-22596/xxx.xxxxxx.xxxxxx D/IabHelper﹕ Owned items response: 0
05-13 19:46:59.659  22390-22596/xxx.xxxxxx.xxxxxx D/IabHelper﹕ Continuation token: null
05-13 19:46:59.659  22390-22596/xxx.xxxxxx.xxxxxx D/IabHelper﹕ Querying SKU details.
05-13 19:46:59.689  22390-22596/xxx.xxxxxx.xxxxxx D/IabHelper﹕ Querying owned items, item type: subs
05-13 19:46:59.689  22390-22596/xxx.xxxxxx.xxxxxx D/IabHelper﹕ Package name: xxx.xxxxxx.xxxxxx
05-13 19:46:59.689  22390-22596/xxx.xxxxxx.xxxxxx D/IabHelper﹕ Calling getPurchases with continuation token: null
05-13 19:46:59.699  22390-22596/xxx.xxxxxx.xxxxxx D/IabHelper﹕ Owned items response: 0
05-13 19:46:59.699  22390-22596/xxx.xxxxxx.xxxxxx D/IabHelper﹕ Continuation token: null
05-13 19:46:59.699  22390-22596/xxx.xxxxxx.xxxxxx D/IabHelper﹕ Querying SKU details.
05-13 19:46:59.829  22390-22596/xxx.xxxxxx.xxxxxx D/IabHelper﹕ Ending async operation: refresh inventory
05-13 19:46:59.829  22390-22390/xxx.xxxxxx.xxxxxx D/AndroidRuntime﹕ Shutting down VM
05-13 19:46:59.829  22390-22390/xxx.xxxxxx.xxxxxx W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x41b31ba8)
05-13 19:46:59.839  22390-22390/xxx.xxxxxx.xxxxxx E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: xxx.xxxxxx.xxxxxx, PID: 22390
    java.lang.NullPointerException
            at xxx.xxxxxx.xxxxxx.MyActivity$1.onQueryInventoryFinished(MyActivity.java:266)
            at xxx.xxxxxx.xxxxxx.util.IabHelper$2$1.run(IabHelper.java:630)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5017)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
            at dalvik.system.NativeStart.main(Native Method)
...

PS:我刚刚更新了代码以突出显示第 266 行。


额外的

我在上传 APK 12 小时后遇到了这个问题,正如您从 LogCat 中看到的那样,它表明"In-app billing version 3 supported"对于我的应用程序。
无论我将应用内产品的状态设置为活动还是非活动,问题仍然存在。

现在 24 小时后,它神奇地决定正常工作。

由此我只能确定这是 Google Play 的问题,而不是我的代码的问题。


我在同一条船上。我等着看会发生什么。

在谷歌文档中http://developer.android.com/training/in-app-billing/test-iab-app.html http://developer.android.com/training/in-app-billing/test-iab-app.html

有一个警告,也许这就是问题所在:

警告:将 APK 上传到 Google Play 后,最多可能需要 2-3 小时才能识别您更新的 APK 版本。如果您在 Google Play 识别您上传的 APK 之前尝试测试您的应用程序,您的应用程序将收到“购买已取消”响应,并显示错误消息“此版本的应用程序未启用应用内结算”。

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

应用内结算:“查询可供购买的商品”返回 0 件商品 的相关文章

  • Android 应用程序因 Firebase 电话身份验证而崩溃

    我正在使用 firebase 进行电话号码身份验证 当我使用我的电话号码时 它会自动验证它 但是当我使用另一个电话号码时 我得到类转换异常 它说 getGoogleApiForMethod 返回 Gms stackoverflow上也有类似
  • 在 Android 中获取联系方式需要花费大量时间?

    您好 目前正在做一个与联系人相关的项目 我正在从联系人中获取详细信息 电子邮件 电话号码和联系人姓名 效果很好 但问题是获取联系方式需要很长时间 超过 1000 个联系人 包括从社交网站同步的联系人 这样我就放了一个Asynchronous
  • 删除 Android 中切换按钮的填充

    我正在 android 中创建一个简单的切换按钮并将背景设置为可绘制对象
  • 未找到 Google 地图 api v2 类

    我正在使用谷歌地图 api v2 一切正常 今天早上我更新了 sdk 现在地图无法工作 尝试了很多事情 例如再次导入 lib 项目 但似乎没有任何效果 请帮忙 这是 logcat 输出 05 16 08 53 34 327 E dalvik
  • Android Surface 与 Canvas 的关系

    Surface 和 Canvas 之间到底是什么关系 请解释 表面是一个缓冲区 画布保存绘图 视图未附加到画布 也不是表面 窗户被绑在 Surface 和 ViewRoot 询问 随后使用的画布表面 通过要绘制的视图 详细答案你可以阅读这篇
  • 在我授予许可后,表面视图不显示相机

    public View onCreateView LayoutInflater inflater Nullable ViewGroup container Bundle savedInstanceState View view inflat
  • Android 上的嵌套滚动

    我们的活动中有一个主要的水平滚动视图 以及嵌套在其中的几个垂直滚动视图 这个想法是水平滚动 直到找到所需的垂直列表 然后上下滚动 理想情况下 一旦开始垂直滚动 我希望垂直滚动具有 锁定 现在会发生什么 如果您非常小心 您可以垂直滚动 但如果
  • 如何实现可运行队列

    我正在尝试实现一个可运行队列 在异步任务期间依次执行 意味着队列中的下一个将在另一个完成后执行 我编写了一个管理器来管理这些可运行对象和本身就是可运行对象的任务 然后 我获取异步任务中的第一个任务并运行它 希望它能够在队列中运行 但是它最终
  • Android - 对话框内VideoView的MediaController出现在对话框后面

    我有一个VideoView在自定义对话框中 我正在为VideoView即时并将其分配给VideoView在代码中 但是控制器实际上并没有出现在视频上 它出现在对话框后面 知道如何让控制器位于视频上方吗 我创建了一个静态对话框帮助器类来帮助构
  • Android 上 WebRTC 的自定义视频源

    Overview 我想使用自定义视频源通过 WebRTC Android 实现来直播视频 如果我理解正确的话 现有的实现仅支持 Android 手机上的前置和后置摄像头 以下类与此场景相关 Camera1Enumerator java ht
  • Android键盘点击搜索输入时出现和消失

    我在用谷歌地图 Js API当我搜索一个地方时 我的输入搜索栏工作正常 当我通过 iPhone 设备使用它时 它也工作得很好 但是当我通过Android 设备然后键盘立即出现和消失 我已经找到了一些关于当我按下搜索栏时 android 键盘
  • 喷气背包中不同类型的宽度组成

    我正在 jetpack compose 的文本字段中工作 我想建立这样的东西 TextField value value onValueChange value it modifier Modifier requiredWidth 56 d
  • 当我单击 GridView 项时返回 ImageView 实例

    当我点击GridView项时如何返回ImageView实例 我为 ItemClick 创建自定义绑定事件 public class ItemClickSquareBinding MvxBaseAndroidTargetBinding pri
  • 在 NumberPicker 中显示更多数字

    我有两个问题 第一个问题是删除 NumberPicker 中的分隔线 我在 Android 中扩展 NumberPicker 来解决这个问题 如下所示 import android content Context import androi
  • 尝试在后台使用 AsyncTask 解析 JSON 时强制关闭

    我是 Android 开发新手 正在研究 json 数据 我设法让解析工作 我想显示一个 ProgressDialog 我读到我需要使用 AsyncTask 但由于某种原因 一旦我将相同的工作代码放入 doInBackground 中 即使
  • 不幸的是应用程序已在 Android 模拟器中停止

    我是 Android 新手 正在尝试一些小应用程序 例如 Compass 当我在模拟器中运行应用程序时 它会给出消息Unfortunately Compass has Stopped 我没有编译时错误 我该如何解决这个问题 是什么原因造成的
  • startDrag 方法 已弃用且无法编译程序

    startDrag android content ClipData android view View DragShadowBuilder java lang Object int 已弃用 如何解决这个问题而又不失去对旧版本的兼容性 还有
  • 如何在清单文件中添加符合我意图的标志

    我们知道 我们可以使用 java 代码中的 addFlags 方法将一些标志添加到我们的意图中 有什么方法可以将这些标志添加到清单文件本身中 而不是用 java 代码编写 我需要为清单中的一项活动添加 REORDER TO FRONT 标志
  • 如何在运行时检查授予权限?

    In Android M 预览版 用户可以选择特定的应用程序并检索特定的权限 所以我问如何在运行时检查授予权限 您可以使用以下复制的代码https android googlesource com platform frameworks b
  • Visual Studio代码无法检测到模拟器设备或连接的电话

    I was running my app with vscode using Android emulator or my phone however all of a sudden vscode could not identify an

随机推荐