java - 检查用户是否订阅的正确方法?

标签 java android in-app-purchase android-billing

我正在使用以下代码查询订阅状态。有了这个我就可以得到关于这个订阅的 boolean 状态。此结果是否会受到网络状态或程序包卸载/重新安装或任何其他条件的影响。查找订阅状态的方法是否正确?

mHelper = new IabHelper(this, PUBLIC_KEY);
mHelper.startSetup( new IabHelper.OnIabSetupFinishedListener() {
public void onIabSetupFinished(IabResult result) {
        if ( ! result.isSuccess()) {
            return;
        }
        if (QueryInventoryListner.mHelper == null){
            return;
        }
        mHelper.queryInventoryAsync(mGotInventoryListener);
        }
    });

&查询库存完成监听器

mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
@Override
public void onQueryInventoryFinished(final IabResult result, final Inventory inventory) {
    Purchase subscriptionForFullVersion = inventory.getPurchase(SKU_SUBSCRIPTION);
    boolean isSubscribe = subscriptionForFullVersion != null ;
        if( isSubscribe ) {
        //User is subscribed to SKU_SUBSCRIPTION
        }
}

最佳答案

此代码示例即使在重新安装应用程序后也能正常工作。

你忘记添加 try\catch block :

public void onIabSetupFinished(IabResult result) {    
        if (!result.isSuccess()) {
           return;
        }
        if (QueryInventoryListner.mHelper == null){
           return;
        }
        try {
           mHelper.queryInventoryAsync(mGotInventoryListener);
        } catch (IabAsyncInProgressException e) {
           complain(context.getResources().getString(R.string.subscription_error_subscription_error_to_query_inventory_another_async));
        }
    }

我的 mGotInventoryListener 是这样的:

// Listener that's called when we finish querying the items and subscriptions we own
private QueryInventoryFinishedListener mGotInventoryListener = new QueryInventoryFinishedListener() {
    public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
        Logging.d(TAG, "Query inventory finished.");

        // Have we been disposed of in the meantime? If so, quit.
        if (mHelper == null) return;

        // Is it a failure?
        if (result.isFailure()) {
            complain(context.getResources().getString(R.string.subscription_error_subscription_error_to_query_inventory) + " " + result);
            return;
        }

        Logging.d(TAG, "Query inventory was successful.");

        // First find out which subscription is auto renewing
        Purchase subscriptionMonthly = inventory.getPurchase(SKU_SUBSRIPTION_MONTHLY);

        // The user is subscribed if either subscription exists, even if neither is auto
        // renewing
        mSubscribedToFreeAds = (subscriptionMonthly != null);
        Logging.d(TAG, "User " + (mSubscribedToFreeAds ? "HAS" : "DOES NOT HAVE")
                + " monthly subscription.");
        if (mSubscribedToFreeAds) {
            putPurchase(subscriptionMonthly);//save purchase
            isSubscribed = true;
        } else {
            clearPurchase();
            isSubscribed = false;
        }

        updateUi();
        setWaitScreen(false);
        Logging.d(TAG, "Initial inventory query finished; enabling main UI.");
    }
};

您还可以在发布前测试您的订阅: Setting Up for Test Purchases

关于java - 检查用户是否订阅的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46916270/

相关文章:

具有网络摄像头连接的 Java ANPR 项目

android - 我可以在启用配对设备的任何蓝牙时通知吗?

java - 将 Parcelable 对象传递给新 Activity 返回 null

java - 记录器在类(class)中的位置应该是什么?

java - 查找非英文字符的 unicode

iphone - 消耗品应用内购买和恢复按钮

ios - 我可以在 uiWebView 中使用重定向到我们网站上的支付网关来购买我们将用于登录 iOS 应用程序的代码吗?

ios - 应用内自动更新订阅演练

java - 在多线程(Java 或 .Net)程序中,我可以假设复制变量是原子的吗?

java - BaseAdapter ResourceNotFound 异常