从第二次“应用内购买”开始在 Android 中抛出异常

2024-03-03

我正在尝试包含在应用程序购买中,并且已成功显示可用的 SKU。现在我想进行虚假购买。所以我使用了 appId =“android.test.purchased”。第一次它工作完美,但从接下来它抛出异常,如下所示。

尝试在空对象引用上调用虚拟方法“android.content.IntentSender android.app.PendingIntent.getIntentSender()”

有人遇到过这样的情况吗?

package com.inappbilling.poc;

import java.util.ArrayList;

import org.json.JSONObject;

import android.app.Activity;
import android.app.PendingIntent;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

import com.android.vending.billing.IInAppBillingService;

public class TestInAppPurchase extends Activity {
    private final static String SERVICE_INTENT = "com.android.vending.billing.InAppBillingService.BIND";
    private static final String _TAG = "BILLING ACTIVITY";

    private final String _testSku = "android.test.purchased";
    //available skus
    static final String SKU_7DAYS = "7days";
    static final String SKU_30DAYS = "30days";

    private Button _7daysPurchase = null;
    private Button _30daysPurchase = null;
    private IInAppBillingService _service = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d(_TAG, "created");

        _7daysPurchase = ( Button ) findViewById(R.id.sevendays_btn);
        _30daysPurchase = ( Button ) findViewById(R.id.thirtydays_btn);
        _7daysPurchase.setOnClickListener(_purchaseListener);
        _30daysPurchase.setOnClickListener(_purchaseListener);

    }

    @Override
    protected void onStart() {
        super.onStart();
    }

    OnClickListener _purchaseListener = new OnClickListener() {

        @Override
        public void onClick(View v) {
            switch ( v.getId() ) {
            case R.id.sevendays_btn:
                doPurchase();
                break;
            case R.id.thirtydays_btn:
                break;
            }
        }
    };


    private ServiceConnection _serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {       
            _service = IInAppBillingService.Stub.asInterface( service );
            Log.d(_TAG, _service.toString());
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {     
            _service = null;
            Log.d(_TAG, "destroyed");
        }

    };

    private void doPurchase(){

        if ( _service == null) {
                Log.e( _TAG , "Billing failed: billing service is null ");
                return;
        }

        ArrayList testSku = new ArrayList( );
        testSku.add( _testSku );
        Bundle querySkus = new Bundle();
        querySkus.putStringArrayList("ITEM_ID_LIST", testSku);
        Bundle skuDetails ;
        try {
            skuDetails = _service.getSkuDetails(3, getPackageName(), "inapp", querySkus);
            int response = skuDetails.getInt("RESPONSE_CODE");
            if( response == 0 ){
                ArrayList<String> responseList = new ArrayList<String>( );
                responseList = skuDetails.getStringArrayList("DETAILS_LIST");
                for( String responseString : responseList ) {
                    JSONObject jobj = new JSONObject( responseString );
                    String sku = jobj.getString("productId");
                    if( sku.equals( _testSku )){
                         Bundle buyIntentBundle = _service.getBuyIntent(3, getPackageName(), sku ,"inapp","" );
                         PendingIntent pendingIntent = buyIntentBundle.getParcelable("BUY_INTENT");
                         startIntentSenderForResult(pendingIntent.getIntentSender(),
                                 1001, new Intent(), Integer.valueOf(0), Integer.valueOf(0),
                                 Integer.valueOf(0));
                    }
                }
            } else {
                Log.e( _TAG , "Failed " );
            }
        } catch (Exception e) {
            Log.e( _TAG, "Caught exception  !"+ e.getMessage() );
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(requestCode == 1001 ){
            String purchaseData = data.getStringExtra("INAPP_PURCHASE_DATA");
            if( resultCode == RESULT_OK ){
                try{
                    JSONObject jobj = new JSONObject( purchaseData );
                    String sku = jobj.getString(_testSku);
                    String paid = jobj.getString("price");
                    Log.v("SKU DATA", sku +"============"+ paid);

                }catch( Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

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

您好,了解上述问题的解决方案。要解决此问题,您应该清除 Android 手机上 Google Play 应用程序的缓存。当我们进行任何应用内购买时,详细信息均由 Google Play 服务维护。所以一旦购买了产品,就会隔离特定的 SKU,以避免重复购买。 注意 - 这实际上是为了测试目的。因为 Google Play 服务维护所有具有应用内购买或 Oauth 或任何其他设施的应用程序的记录。 希望它能帮助那些面临这个问题的人。

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

从第二次“应用内购买”开始在 Android 中抛出异常 的相关文章

随机推荐

  • 与多列进行字符串匹配以查找 r 中可能的结果

    我有两个数据框 DF1 和 DF2 在 DF1 中 我有不同的字符串组合 在 DF2 中 我有不同字符串组合的结果 我需要将 DF1 与 DF2 中的字符串或字符串组合进行匹配 并根据字符串匹配创建多个结果列作为结果数据帧 DF Resul
  • HRESULT:0x80131040:找到的程序集的清单定义与程序集引用不匹配

    找到的程序集的清单定义与程序集引用不匹配 通过 ncover 运行 nunit 时得到此信息 任何想法 这是程序集之间的不匹配 从程序集引用的 DLL 没有预期的方法签名 清理解决方案 重建所有内容 然后重试 另外 如果这是对 GAC 中某
  • Magento API 的创建发票方法无法正常工作

    我正在尝试使用 XMLRPC 在 Android 应用程序中使用 Magento API 创建销售订单发票 我正在使用方法 sales order invoice create 用于创建发票 此方法在给定数量的响应中为我提供发票 ID 如中
  • 如何通过 API Laravel 处理用户注册

    我一直在阅读和观看一些有关 Laravel API 开发的教程 尽管我使用过一些 Laravel 但我对 API 开发完全是新手 从我读过的所有教程来看 它们处理的是 登录 获取一些数据 更新信息 删除信息 甚至将一些信息插入数据库 我的问
  • C# .NET 中的 Web 响应最多只能运行几次

    我正在使用 twitter api 开发一个应用程序 其中涉及编写一个方法来检查用户是否存在 这是我的代码 public static bool checkUserExists string user string URL https tw
  • 如何在 Struts 2 中向我的所有视图公开一个对象?

    我有一个使用 Struts 2 和 Freemarker 模板以及 Spring 4 的 Web 应用程序 我有一些配置字符串存储在 properties我需要在每个页面上呈现的文件 例如 我们的 CDN 路径 其中包含版本字符串 现在这些
  • OSError:libgdal.dylib:无法打开文件

    问题是 Docker 无法正常运行 因为OSError opt homebrew Cellar gdal 3 3 0 2 lib libgdal dylib cannot open shared object file No such fi
  • 使用 Pyx 绘制大括号

    如何使用 Pyx 在任意两个点之间绘制一条 支撑 线 它看起来像这样 大括号示例http tof canardpc com view d16770a8 0fc6 4e9d b43c a11eaa09304d http tof canardp
  • 如何编写一个以两个矩阵 A 和 B 作为输入并输出乘积矩阵 A*B 的函数?

    如何编写一个以两个矩阵 A 和 B 作为输入并输出乘积矩阵 A B 的函数 使用 MATLAB 带有循环和条件 我的尝试 function prodAB MultiplicoMatrices A B prod 0 prodAB for i
  • 发生特定情况时如何停止 Kotlin 流程

    如果代码中发生某些情况 我想取消 kotlin 流程 假设我有一个方法如下 fun test Flow
  • 自定义设备控制器不工作

    我有两个模型居民和用户 它们都包含 roll number 属性 我现在已经在驻留模型中输入了数据 当用户注册哪个是 Devise 资源时 它会检查驻留模型中是否存在相同的 roll number 然后就可以注册用户了 所以基本上我向 De
  • 替换JS中某个字符的所有实例?

    我正在尝试创建一个简单的函数来替换 JS 中字符串中某个字符的所有实例 在这种情况下 我想替换所有a s with o s 我很确定代码是正确的 但输出仍然是原始字符串 function replaceLetter string for v
  • mongorestore 随机崩溃(致命错误)

    我使用的是 macOS 10 12 mongod version db version v3 2 8 git version ed70e33130c977bda0024c125b56d159573dbaf0 OpenSSL version
  • 如何在源代码中查找搜索词

    我正在寻找一种在项目的 C C 代码中搜索给定术语的方法 同时忽略注释和字符串中出现的任何情况 由于代码库相当大 我正在寻找一种方法自动地识别与我的搜索词匹配的代码行 因为它们需要手动检查 如果可能的话 我想在我的 Linux 系统上执行搜
  • 绘制相同值时显示更大的点

    当我绘制以下示例时 Participant lt c 1 12 AnswersDay1 lt c 9 3 9 13 7 12 10 7 9 0 12 11 Day1Group lt c 0 1 0 1 0 1 0 1 0 1 0 1 Pus
  • 傅立叶空间中的滤波器的行为与预期不同

    这是我提出的已回答问题的后续内容 可以找到here https stackoverflow com questions 54022376 inverse fft returns negative values when it should
  • RDP(VM) 最小化时自动化脚本失败

    我一直面临着在其中一台虚拟机上自动执行脚本的问题 我已经实现了保存文档功能的自动化 该功能最好是 Windows 设计的 UI 我尝试过使用各种技术 工具 如 AutoIT Python Sikuli 但如果虚拟机最小化 脚本就会停止 如果
  • 使用 Savon 在 Ruby on Rails 中进行 SOAP 调用在信封和主要操作方面变得很奇怪

    在使用 Savon rb 的 Rails 项目中 我尝试进行非常复杂的 SOAP 调用 至少复杂到 Savon 构建者太麻烦了 所以我决定直接操作 xml 首先我启动客户端 client Savon client endpoint gt h
  • 有 XHTML 5 验证器吗?

    是否有专门针对 XHTML 5 的验证器 即 HTML 5 的 XML 序列化 这W3C 验证器 http validator w3 org 支持文档类型 HTML 5 experimental which treats as valid
  • 从第二次“应用内购买”开始在 Android 中抛出异常

    我正在尝试包含在应用程序购买中 并且已成功显示可用的 SKU 现在我想进行虚假购买 所以我使用了 appId android test purchased 第一次它工作完美 但从接下来它抛出异常 如下所示 尝试在空对象引用上调用虚拟方法 a