安卓应用内购买,如何处理应用程序重新安装

5

我对应用内购买的工作原理感到非常困惑。我已经阅读了文档,但可能错过了某些内容,因为我不明白我需要在我的应用程序中实现什么最后一步才能使其工作。应用内购买功能很好,但是如果用户在将来的某个日期卸载我的应用并重新安装它,我的应用程序就不知道如何确定应用内购买是否以前已经完成。以下是我主类中的代码片段,我试图在其中处理所有这些内容:

@Override
public void onCreate(Bundle savedInstanceState)
{
    mContext = this;
    startService(new Intent(mContext, BillingService.class));
    BillingHelper.setCompletedHandler(mTransactionHandler);
}

我正在使用地牢示例项目中的示例类。 我不明白的是,下面的代码在购买时如何工作,但重新运行它无法检查是否已经购买了某些内容。 我已经卡在这部分大约一个月了,对此感到非常沮丧。

public Handler mTransactionHandler = new Handler()
{
    public void handleMessage(android.os.Message msg)
    {
        Log.i(TAG, "Transaction complete");
        Log.i(TAG, "Transaction status: "
            + BillingHelper.latestPurchase.purchaseState);
        Log.i(TAG, "Item purchased is: "
            + BillingHelper.latestPurchase.productId);

        if (BillingHelper.latestPurchase.isPurchased())
        {
            new Message("Thank you!", getApplicationContext());
            PAY_VERSION = true;
            SharedPreferences purchasePreferences = getSharedPreferences(PURCHASE_PREFERENCES, Activity.MODE_PRIVATE);
            Editor purchaseEditor = purchasePreferences.edit();
            purchaseEditor.putBoolean("purchased", PAY_VERSION);
            purchaseEditor.commit();
            Intent intent = getIntent();
            finish();
            startActivity(intent);
        }
    };

我需要的是一些查询服务器以查看此物品是否已购买的方法。我知道这里有一个`PURCHASE_STATE_CHANGED`,但我不知道它确定状态已更改时该怎么做,也不知道如何启动它以进行检查。我很茫然,所以我只需要在正确的方向上得到一个好的推动,因为目前我完全迷失了方向。
编辑:
我还听说需要解析JSON,但我甚至不知道该如何开始。
编辑2:
我应该调用这个东西来检查吗?
BillingHelper.restoreTransactionInformation(BillingSecurity.generateNonce());
BillingHelper.getPurchaseInformation(new String[] {"myItem"});

之前的代码在我妹妹的手机上(SGS3, ICS) 崩溃了,但在我的手机(GN, ICS, 和 JB)上却没有。我在第一个活动的onCreate()中调用它,但不确定getPurchaseInformation(...)被调用后该如何处理。它没有返回值,所以不知道是否可以解析JSON或者做其它操作...

此外,这两行代码给了我这个:

08-27 11:54:04.271: E/BillingService(17702): BillingHelper not fully instantiated
08-27 11:54:04.271: E/BillingService(17702): BillingHelper not fully instantiated
2个回答

0

JSON

下面是一个包含订阅购买令牌的JSON订单对象示例。

{ "nonce" : 1836535032137741465,

  "orders" :
    [{ "notificationId" : "android.test.purchased",
       "orderId" : "transactionId.android.test.purchased",
       "packageName" : "com.example.dungeons",
       "productId" : "android.test.purchased",
       "developerPayload" : "bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ",
       "purchaseTime" : 1290114783411,
       "purchaseState" : 0,
       "purchaseToken" : "rojeslcdyyiapnqcynkjyyjh" }]
}

如何在Java中解析JSON

Android 支持JSON

Android计费

如果您有远程服务器,建议您将购买信息存储在服务器上而不是设备上的本地数据库中。可以看这里

阅读有关托管每个用户帐户、非托管或订阅的介绍

我像这样使用计费:

  1. 在 onCreate 方法中

     BillingHelper.setCompletedHandler(handlerTransaction);
    

    你的代码中有一个 handler。

  2. 接下来在 onClick 或其他方法中

     BillingHelper.requestPurchase(this, currentMarketProduct.getMarketId());
    

谢谢提供这些信息!非常有用,但我仍然不确定如何查询Play商店,以检查某个项目是否已被购买,如果我的应用程序被重新安装。我的购买部分正常工作,就像我上面所说的那样。我被告知需要查询JSON以通过应用内计费检查已购买哪些物品。 - user1146523

0

你在第二次更新中走上了正确的道路。诀窍是意识到一切都是异步完成的。

典型的流程如下:

用户安装您的应用程序。 在首次加载应用程序时,检查是否需要恢复购买。 如果需要,向Google发送一个RESTORE_TRANSACTION同步请求。 Google将以确认响应回复您的RESTORE_TRANSACTION请求。(这只是他们收到您请求的确认。) 此时,您应该标记已经向Google发送了恢复请求,并且不需要从应用程序中再发送其他恢复请求。 现在,Google将异步地开始向您的应用程序发送“PURCHASE_STATE_CHANGED”事件,以表示用户先前购买的每个应用内购买。这个调用与用户第一次购买该应用内产品时Google发送的调用相同。 由于是相同的调用,您的应用程序会捕获该事件并正常处理,就像用户刚刚购买了应用内产品一样(从而“恢复”已购买的功能)。
关于步骤2和5,我为我的应用程序所做的是保持一个名为“APP_INITIALISED”的SharedPreference值,默认值为false。每次我的应用程序启动时,如果“APP_INITIALISED”为false,我告诉Google进行RESTORE_TRANSACTION(步骤2),然后将APP_INITIALISED设置为true(步骤5)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接