Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/179.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
应用内计费测试:android.test.purchased已拥有_Android_In App Billing - Fatal编程技术网

应用内计费测试:android.test.purchased已拥有

应用内计费测试:android.test.purchased已拥有,android,in-app-billing,Android,In App Billing,我目前正在测试未来应用的应用内计费,在我第一次成功“购买”测试项目“android.test.purchased”后,我现在每次尝试再次购买时都会收到响应代码7,这意味着我已经拥有该项目 12-15 23:02:14.149:E/IABHeloper(19829):应用内计费错误:无法 要购买商品,错误响应:7:商品已拥有 据我所知,这次购买应该是可能的,对吧?这样开发者就可以测试他/她的应用了 如果不是,我如何将其状态“重置”为非国有?我使用的是谷歌应用内计费示例中的util包。这是消耗品和非

我目前正在测试未来应用的应用内计费,在我第一次成功“购买”测试项目“android.test.purchased”后,我现在每次尝试再次购买时都会收到响应代码7,这意味着我已经拥有该项目

12-15 23:02:14.149:E/IABHeloper(19829):应用内计费错误:无法 要购买商品,错误响应:7:商品已拥有

据我所知,这次购买应该是可能的,对吧?这样开发者就可以测试他/她的应用了


如果不是,我如何将其状态“重置”为非国有?我使用的是谷歌应用内计费示例中的util包。

这是消耗品和非消耗品之间的区别;非消耗品(您在这里似乎要处理的)的状态会持续跟踪,而消耗品可以多次购买。您必须进入游戏管理控制台,取消/退款销售以再次测试它。

结果表明,android.test.purchased项目的行为类似于常规ID。这意味着如果您想再次购买它,您必须在代码中的某个地方使用它。我认为Google文档在这个问题上有误导性,他们应该添加另一个静态ID,您可以无休止地购买该ID进行测试。

将此代码添加到线程以启动消费请求

int response = mService.consumePurchase(3, getPackageName(), purchaseToken);
对于购买测试,purchaseToken是

purchaseToken = "inapp:" + getPackageName() + ":android.test.purchased";

那么消费是成功的

此外,不要忘记在中公开mService

Java

然后就可以这样访问:

int response = mHelper.mService.consumePurchase(3, getPackageName(), purchaseToken);
PurchasesResult purchasesResult = mBillingClient.queryPurchases(BillingClient.SkuType.INAPP);
    for (Purchase sourcePurchase : purchasesResult.getPurchasesList()) {
        if(sourcePurchase != null){

            ConsumeResponseListener listener = new ConsumeResponseListener() {
                @Override
                public void onConsumeResponse(String outToken, @BillingResponse int responseCode) {

                    System.out.println("all consumed");
                }
            };
            mBillingClient.consumeAsync(sourcePurchase.getPurchaseToken(), listener);
        }else{
            System.out.println("null");
        }
    }

// and then initiate whole process with clear "shoping basket"

BillingFlowParams.Builder builder = new BillingFlowParams.Builder()
        .setSku(itemName).setType(BillingClient.SkuType.INAPP);
应用内版本3:

IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {

    public void onQueryInventoryFinished(IabResult result, Inventory inventory) {

        .....................

        if (inventory.hasPurchase(SKU_CONTENT)) {

            mHelper.consumeAsync(inventory.getPurchase(SKU_CONTENT), null);
        }
    }
};

这就是我们如何消费该商品的方式

 consume.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Thread t = new Thread(new Runnable() {
                @Override
                public void run() {
                    String purchaseToken = "inapp:" + getPackageName() + ":android.test.purchased";
                    try {
                        Log.d("","Running");
                        int response = mService.consumePurchase(3, getPackageName(), purchaseToken);
                        if(response==0)
                        {
                            Log.d("Consumed","Consumed");
                        }else {
                            Log.d("","No"+response);
                        }
                    }catch (RemoteException e)
                    {
                        Log.d("Errorr",""+e);
                    }

                }
            });
            t.start();
        }
    });

在我的例子中,谷歌似乎没有记录购买该商品的情况。相反,谷歌Play服务的本地副本会缓存购买的内容。这样,当在同一台设备上发出第二个请求时,
android.test.purchased ready owned
。但是,使用其他设备或重置设备会清除缓存,并允许重复购买。

无需编写任何特殊消费代码。只需使用adb命令清除Google Play Store数据:

adb shell pm clear com.android.vending

在我看来,如果你的程序不是设计用来消费物品的,你不需要调整代码来清除外部供应商的内存。这将使您的代码更加脆弱,然后您将不得不花费大量时间添加和删除不属于您的软件的代码,因此实现这样的解决方案是一个糟糕的设计

对于我来说,清除android.test.com的最佳解决方案是

adb uninstall com.yourapp.name
然后

adb shell pm clear com.android.vending
我不需要清除现金,也不需要浏览我的应用程序设置或更改代码。我确实需要将adb添加到windows系统的路径变量中,这非常简单。所以,是的,你需要使用adb,你可能无论如何都需要它


您只需添加C:\…\android sdk\platform工具;在windows环境变量中的路径,我想在mac和linux操作系统中也是非常简单的。希望它能帮助人们少花几天时间在应用程序中实现android billings

就我而言,我只需要清除应用缓存。清除缓存后,我能够再次启动购买流


从我的设备(4.4.2),我导航到“设置->应用程序管理器”。接下来,我从“下载”选项卡中选择应用程序,然后选择“清除缓存”。

第3版-解决问题的最快方法:清除Google Play Store的缓存将使“android.test.purchased”再次可用。

主要问题是您必须使用
android.test.purchased
项。但此项在查询库存中不可用,因此无法使用正常流程进行消费

因此,如果您正在使用IABHeloper,在
IABHeloper
类中,您可以临时将
IInapplingService
mService更改为public,以便可以从IABHeloper访问它

然后在你的课堂上,你可以这样消费

int response = mHelper.mService.consumePurchase(3, getPackageName(), "inapp:"+getPackageName()+":android.test.purchased");
如果成功,响应将为0


希望这有帮助。

如果您在测试环境中

1) 在android.test.purchased的情况下,我可以通过重启android设备(消耗库存)来重置假支付

2) 在InApp util中有一个名为Security.java的文件,请按以下方式创建临时文件。由于安全异常,测试付款(假)总是返回假

public static boolean verifyPurchase(String base64PublicKey,
                                     String signedData, String signature) {
    return true; }
然后在您的OnIabPurchaseFinishedListener中调用fechInvForconsumeItem()

fechInvForconsumeItem()是

消费侦听器是

    IabHelper.OnConsumeFinishedListener mConsumeFinishedListener =
        new IabHelper.OnConsumeFinishedListener() {
            public void onConsumeFinished(Purchase purchase,
                                          IabResult result) {

                if (result.isSuccess()) {
                } else {
                    // handle error
                    Log.e("11","sucConsume");
                }
            }
        };

出于测试目的,我还建议您插入一段代码,在调用初始化gp购买流的方法之前,该代码将清除您购买的所有产品。当你现在只测试一个项目时,这是特别舒服的。例如,像这样:

int response = mHelper.mService.consumePurchase(3, getPackageName(), purchaseToken);
PurchasesResult purchasesResult = mBillingClient.queryPurchases(BillingClient.SkuType.INAPP);
    for (Purchase sourcePurchase : purchasesResult.getPurchasesList()) {
        if(sourcePurchase != null){

            ConsumeResponseListener listener = new ConsumeResponseListener() {
                @Override
                public void onConsumeResponse(String outToken, @BillingResponse int responseCode) {

                    System.out.println("all consumed");
                }
            };
            mBillingClient.consumeAsync(sourcePurchase.getPurchaseToken(), listener);
        }else{
            System.out.println("null");
        }
    }

// and then initiate whole process with clear "shoping basket"

BillingFlowParams.Builder builder = new BillingFlowParams.Builder()
        .setSku(itemName).setType(BillingClient.SkuType.INAPP);
我使用了adb shell:

adb shell pm clear com.android.vending

转到Google Play控制台并打开订单管理选项卡。在那里,您可以退款/取消试购。

但问题是,我对这些“假冒”商品没有任何“权力”,我也不知道在哪里可以更改销售状态,因为它们不是真正的购买。关于android.test.purchased:当您使用此产品ID发出应用内账单请求时,Google Play会做出响应,就好像您成功购买了一件商品一样。所以我很困惑:/你还在做静态响应测试吗?如果是这样,您只需要更改发送的静态响应。听起来你要“用你自己的产品ID测试应用程序内的购买”,但是,它可以用可取消的订单进行真正的购买。我仍然坚持使用静态ID。我希望能够使用android.test.purchased ID测试应用内购买。这是第一次,根据我从谷歌文档中了解到的情况,它应该一直工作。对不起,我不清楚!我的误解,对不起。因为
PurchasesResult purchasesResult = mBillingClient.queryPurchases(BillingClient.SkuType.INAPP);
    for (Purchase sourcePurchase : purchasesResult.getPurchasesList()) {
        if(sourcePurchase != null){

            ConsumeResponseListener listener = new ConsumeResponseListener() {
                @Override
                public void onConsumeResponse(String outToken, @BillingResponse int responseCode) {

                    System.out.println("all consumed");
                }
            };
            mBillingClient.consumeAsync(sourcePurchase.getPurchaseToken(), listener);
        }else{
            System.out.println("null");
        }
    }

// and then initiate whole process with clear "shoping basket"

BillingFlowParams.Builder builder = new BillingFlowParams.Builder()
        .setSku(itemName).setType(BillingClient.SkuType.INAPP);
adb shell pm clear com.android.vending