无法弄清楚如何恢复 Android 中应用内购买的交易

2023-12-07

我对 Android 应用内计费的恢复交易感到非常困惑。

我有这个片段用于在我的应用程序中进行捐赠:

BillingHelper.requestPurchase(mContext, "donation");

它工作得很好,没有任何问题。问题就在这里,当购买完成时我设置了一个布尔值:

if (BillingHelper.latestPurchase.isPurchased()) {
          DONATE_VERSION = true;
}

此后应用程序将按预期运行,除非用户卸载该应用程序。我将 DONATE_VERSION 存储在共享首选项中。将购买信息存储在互联网上的个人数据库中不是一种选择。

当用户重新安装应用程序时,他们可以从捐赠中删除广告的唯一方法就是再次捐赠!我不希望出现这样的情况。我希望能够向 Google 查询已购买哪些物品(在本例中为“捐赠”物品)的结果。我在 onCreate() 中调用它:

BillingHelper.restoreTransactionInformation(BillingSecurity.generateNonce());

但现在怎么办?如果用户之前购买了“捐赠”的应用程序内购买管理,我如何查询谷歌以获取有关从应用程序内结算中购买了哪些项目的信息,以便我可以再次设置我的布尔值?请尽可能清楚地说明这一点,因为我一直在处理这个问题,在 IRC 上聊天,并搜索 API 大约 6 个小时,但我无法弄清楚这一点。

EDIT:

我的 onReceive() 方法:

@Override
public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();
    Log.i(TAG, "Received action: " + action);
    if (ACTION_PURCHASE_STATE_CHANGED.equals(action)) {
        String signedData = intent.getStringExtra(INAPP_SIGNED_DATA);
        String signature = intent.getStringExtra(INAPP_SIGNATURE);
        purchaseStateChanged(context, signedData, signature);
    } else if (ACTION_NOTIFY.equals(action)) {
        String notifyId = intent.getStringExtra(NOTIFICATION_ID);
        notify(context, notifyId);
    } else if (ACTION_RESPONSE_CODE.equals(action)) {
        long requestId = intent.getLongExtra(INAPP_REQUEST_ID, -1);
        int responseCodeIndex = intent.getIntExtra(INAPP_RESPONSE_CODE, C.ResponseCode.RESULT_ERROR.ordinal());
        checkResponseCode(context, requestId, responseCodeIndex);
    } else {
       Log.e(TAG, "unexpected action: " + action);
    }

您将在 PURCHASE_STATE_CHANGED 消息中获取交易信息,就像成功购买后一样。像平常一样处理并设置您需要的任何标志/首选项。另请确保仅在首次安装时调用它(当所述首选项缺失/为空时),因为经常调用它会使您的应用程序在一段时间内被阻止。

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

无法弄清楚如何恢复 Android 中应用内购买的交易 的相关文章

  • 未找到 Gradle DSL 方法:“versionCode()”

    构建我的 Android 项目时遇到问题 我使用Grgit https github com ajoberstar grgit填写versionCode and versionName在 gradle 中 一切工作正常 直到我将 Andro
  • 在 Android 中的活动、服务和应用程序之间传递变量

    有人可以给我提供以下活动 服务 应用程序组合的示例吗 我拥有这三个 但我已经把我的应用程序弄得一团糟 试图在这个地方传递一堆变量 现在我不知道发生了什么 请注意 我是 Android 新手 最近我一直在努力解决这个问题 因为有很多方法可以实
  • 更改工具栏中汉堡图标的大小?

    我有两个问题 可能很奇怪 但无论如何 我有带有应用程序标题的工具栏 如何将其更改为非徽标的图片 下一个问题 是否可以设置 更改工具栏中汉堡图标的大小 我在下面的下一个代码的帮助下制作了经典的导航抽屉 我也使用了 ActionBarDrawe
  • android 谷歌+登录定制

    我正在创建一个 Android 应用程序 现在我正在实现社交网络登录 Facebook 按钮很好 但 google 按钮的语言与 Facebook 不同 另外 它只说 登录 我想让它说 用谷歌登录 我是 android 编程的新手 看到我需
  • 无法解析符号 FlutterActivity

    我使用 VCS gt Checkout from Version Control 将 flutter 项目从 github 导入到 Android Studio 中 现在我面临的问题是 Cannot resolve symbol Flutt
  • MI设备中即使应用程序被杀死,如何运行后台服务

    您好 我正在使用 alaram 管理器运行后台服务 它工作正常 但对于某些 mi 设备 后台服务无法工作 我使用了服务 但它无法工作 如何在 mi 中运行我的后台服务 MI UI有自己的安全选项 所以你需要的不仅仅是上面提到的粘性服务 你需
  • Google Inbox 类似 RecyclerView 项目打开动画

    目前 我正在尝试实现 Google Inbox 例如RecyclerView行为 我对电子邮件打开动画很好奇 我的问题是 该怎么做 我的意思是 他们使用了哪种方法 他们用过吗ItemAnimator dispatchChangeStarti
  • Android 手机应用意图

    我想在手机上启动手机应用程序作为意图 我正在使用这个代码 startActivity getPackageManager getLaunchIntentForPackage com android phone 但该函数抛出一个空指针异常 因
  • Cordova 地理定位不适用于 Android

    我想在 Android 上使用地理定位 我用 Apache Cordova 编写应用程序 地理定位在 android 电脑模拟器和 android 手机上均不起作用 I try http cordova apache org docs en
  • Android 在启动时启动服务,如何在设备重启后重新启动服务类?

    我需要在启动时启动一项服务 我搜索了很多 他们正在谈论广播接收器 由于我是 Android 开发新手 所以我对 Android 上的服务并没有清楚的了解 请提供一些源代码 您的接收者 public class MyReceiver exte
  • Facebook LoginActivity 未正确显示

    我有一个使用 Facebook 登录的应用程序 我有 FacebookSDK 并且使用 com facebook LoginActivity 问题是 在 10 英寸平板电脑上 当显示软键盘时 活动无法正确显示 我使用的是 Samsung G
  • 手动启用时 Firebase Crashlytics 不报告崩溃

    Crashlytics 在没有选择加入报告的情况下也能正常工作 但一旦我根据规定设置了选择加入报告 它就会停止报告任何内容tutorial https firebase google com docs crashlytics customi
  • onTouchEvent()中如何区分移动和点击?

    在我的应用程序中 我需要处理移动和单击事件 一次点击是由一个 ACTION DOWN 操作 多个 ACTION MOVE 操作和一个 ACTION UP 操作组成的序列 理论上 如果您收到 ACTION DOWN 事件 然后收到 ACTIO
  • 如何在android中录制音频时暂停背景音乐

    我正在 Android 中开发一个音频记录应用程序 因此 如果设备音乐播放器中已播放任何背景音乐 则应在开始录制之前暂停该背景音乐 并且每当录制停止或暂停时 背景音乐都应恢复 播放录制的音频时也应该如此 有人可以帮我解决这个问题吗 提前致谢
  • 如何在android sdk上使用PowerMock

    我想为我的 android 项目编写一些单元测试和仪器测试 然而 我遇到了一个困扰我一段时间的问题 我需要模拟静态方法并伪造返回值来测试项目 经过一些论坛的调查 唯一的方法是使用PowerMock来模拟静态方法 这是我的 gradle 的一
  • 如何更改锁屏自定义文本(所有者信息)?

    我写了程序代码 String message This is test Settings System putString context getContentResolver Settings Secure LOCK PATTERN EN
  • Google Android Drive api 在已安装版本上登录失败

    我开发了一个使用 GoogleDrive api 的 Android 应用程序 当处于调试状态或运行调试版本时 应用程序 工作正常 并正确验证附加的谷歌帐户 等 当我构建发行版本时 使用我的签名密钥 并且 安装apk文件 当我运行时 Goo
  • Android:如何通过右侧的十字按钮清除EditText

    我创建了一个EditText用于搜索 左侧包含搜索图标 右侧包含图标
  • 在 Android 中更新到 API 26 时,清单合并失败并出现多个错误

    我尝试使用 API 26 更新我的 gradle 安卓工作室2 3 3 但我在编译项目时遇到以下错误 这是我收到的错误的屏幕截图 应用级别build gradle Top level build file where you can add
  • 修改 ADW Android 启动器?

    我想更改和修改开源 ADW 启动器 启动器可在此处获取 https github com AnderWeb android packages apps Launcher https github com AnderWeb android p

随机推荐

  • Go 中按空格分割字符串?

    给定一个输入字符串 例如 word1 word2 word3 word4 在 Go 中将其拆分为字符串数组的最佳方法是什么 请注意 可以有any每个单词之间的空格或 unicode 间距字符数 在Java中我只会使用someString t
  • PHP/MySQL 多级菜单

    我正在尝试使用 PHP 创建动态多级菜单 从 MySQL 数据库获取数据 我已经设法用以下格式在 php 数组中订购菜单项 Array 1 gt Array id gt 1 ubicacion gt top a nivel gt 1 par
  • VBA xmlhttprequest循环而不关闭连接

    我正在 VBA 中使用 xmlhttp 连接到 API 问题是我需要使用相同的 API 链接多次创建循环 唯一的区别是我发送了不同的 JSON 字符串 是否可以仅打开一次连接并发送标头和身份验证 然后多次发送数据并接收响应 主要目的是提高代
  • 有没有办法保存最大 1 MB 的“消息”集合并将结果写入 JSON/CSV 文件

    我有一个阻塞队列 它不断通过某些应用程序获取消息 现在在 asp net 应用程序中 我尝试使用该队列并将输出写入 CSV JSON 文件 在这里 我想保存最多 1MB 的消息 这些消息从阻塞队列接收 然后将其写出 现在再次保存 1MB 的
  • 如何在一个适配器上应用多个过滤器?

    我有一个 listView 和一个搜索字段 它调用我的适配器的 getFilter filter keyword 函数 它工作得很好 但我想添加另一个过滤器来搜索 listViews 对象的不同标签 所以我的适配器需要两个过滤器 对此最好的
  • IntelliJ 的嵌入式终端无法正确加载我的 Fish shell 配置

    IntelliJ 中的 Fish 配置未正确加载 并且我看到有关路径未正确设置的警告 set Warning PATH entry set Did you mean set PATH PATH 因此 IntelliJ 似乎能够获取位于 co
  • C# 导出到excel

    这是将数据导出到现有 xls 工作表的最佳方式 我需要支持很多版本的excel 如果我使用 Visual basic 我将使用 CreateObject Excel application 代码来完成我需要的操作 C 中的等价物是什么 我希
  • AnyLogic 中的系统动力学 - 斐波那契序列 [关闭]

    Closed 这个问题需要调试细节 目前不接受答案 我在 AnyLogic 中有一个系统动力学模型 我试图在其中对斐波那契序列进行建模 然而 由于某种原因 我的结果与预期不同 代替 1 1 2 3 5 8 13 I get 1 2 1379
  • 如何在重命名后找到存储库的新位置

    如果用户将存储库重命名为foo bar git to foo baz git通过 GitHub 的 UI 我如何通过 API 检测到这一点 目前 如果我像这样调用 API 我会收到 404 GET repos foo bar 如何找到新的存
  • 使用正则表达式根据用户名的最后一个字母更改文本

    我希望根据用例更改用户名的结尾 在将运行的语言系统中 名称结尾取决于其使用方式 因此需要定义名称的所有结尾并定义它们的替换 建议使用 gsub 正则表达式在字符串中搜索和替换 根据用户名的最后一个字母更改文本 name surname gs
  • 在 python 中加载 DLL 时出错,不是有效的 win32 应用程序 [重复]

    这个问题在这里已经有答案了 我正在尝试在 python 中加载 DLL 来调用函数 import ctypes from ctypes import dsusb ctypes WinDLL c python27 dsusb dll 我的堆栈
  • Windows 上 R 中的 UTF-8 支持

    由于Windows10添加了新功能 Beta 使用Unicode UTF 8支持全球语言 我认为R可以将语言环境转换为UTF 8 但是 当我尝试将系统区域设置更改为 UTF 8 时 Sys setlocale locale Japanese
  • 我可以使用什么 SQL 从我的付款数据中检索计数?

    计数标准 按学校服务类型按月 年对每所学校的学生人数 通过唯一的学生 ID 进行索引 进行 真实 计数 我目前正在使用 MS Access 我需要能够提取具有与下面的示例数据类似的数据的数据库的计数 每一行都是一个付款观察 样本数据 Stu
  • 用于文件上传的 javascript/flash 库,具有文件大小限制和进度条

    有没有用于此目的的 主流 库 普遍传播 维护良好 有记录等 我发现了这些 使用闪光灯 上传 版本不多 最新为 12 2010 没有文档 SWF上传 最新版本 03 2010 文档 奇特上传 看起来有问题 php文件上传器 看起来很重量级 而
  • 在 Teradata 中满足阈值后,将一列数字分为 30 个组

    考虑代表 事件之间的时间 的列 5 40 3 6 0 9 0 4 5 18 2 4 3 2 我想将它们分成 30 个桶 但桶会重置 期望的结果 0 1 1 1 1 1 1 1 1 2 2 2 2 2 这是因为 当我们累计到 30 时 我们会
  • 3D 应用程序中的 JavaFx 2D 部分

    我编写的应用程序有一个小问题 我想要有一个 3D 字段 并在右侧有一个包含 2D 组件 如按钮 的工具栏 我尝试简单地将这些组件添加到我的根组中 但是无法读取文本 并且它们与所有其他组件一起移动 那么 如何区分这两个区域呢 可能有两个场景
  • 如何更新项目中的 sbt?

    我正在 Coursera 上学习关于 scala 的课程 他们给我布置了作业 我下载了项目 有build sbt在里面 我尝试过sbt终端 Eclipse 和 Idea 中的命令没有任何作用 终端中的消息显示 info Compiling
  • 使用 Flask 使路由只能在调试模式下访问

    我有很多只希望在调试模式下访问的路由 是否有装饰器或其他东西允许我执行此操作 或者我必须完全注释 删除代码吗 例子 debug only app route send data
  • 在 Visual Studio 中向编辑器添加指南

    介绍 我一直在寻找一种方法让 Visual Studio 在一定数量的字符后画一条线 以下是启用这些所谓的指南指导方针适用于各种版本的 Visual Studio Visual Studio 2013 或更高版本 安装保罗 哈林顿的编辑指南
  • 无法弄清楚如何恢复 Android 中应用内购买的交易

    我对 Android 应用内计费的恢复交易感到非常困惑 我有这个片段用于在我的应用程序中进行捐赠 BillingHelper requestPurchase mContext donation 它工作得很好 没有任何问题 问题就在这里 当购