【问题标题】:restore functionality in InApp androidApp android中的恢复功能
【发布时间】:2013-06-20 22:03:13
【问题描述】:

我在我的应用中实施了 Inapp Billing。为此,我使用了按钮。当我单击按钮时,它会进入购买活动并购买产品。购买产品后,该按钮将不可见。另一个按钮将可见,这将允许用户打开产品。这一切都发生得很完美。但是当我再次重新打开应用程序时,购买按钮是可见的。我不希望按钮在购买后可见。一旦用于成功购买,如何使按钮不可见。

StartUpActivity.java

public class StartUpActivity extends PurchaseActivity implements   OnIabSetupFinishedListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
   Log.d("App started");
}
@Override
public void onIabSetupFinished(IabResult result) {
    if (result.isSuccess()) {
        Log.d("In-app Billing set up" + result);
        dealWithIabSetupSuccess();
    } else {
        Log.d("Problem setting up In-app Billing: " + result);
        dealWithIabSetupFailure();
    }
}
@Override
protected void dealWithIabSetupSuccess() {
    navigate().toMainActivity();
    finish();
}
@Override
protected void dealWithIabSetupFailure() {
    popBurntToast("Sorry In App Billing isn't available on your device");
}
}

MainActivity.java

public class MainActivity extends BlundellActivity implements MainMenu {
public Button topicsbutton;
public Button mediabutton;
public Button purchasetopicsbutton;
public Button purchasemediabutton;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    topicsbutton = (Button) findViewById(R.id.button1a);
    mediabutton = (Button) findViewById(R.id.button2a);
    purchasetopicsbutton = (Button) findViewById(R.id.button1);
    purchasemediabutton = (Button) findViewById(R.id.button2);
}
@Override
public void onTopicsPurchaseItemClick(View v) {
    navigate().toPurchaseTopicsActivityForResult();
}
@Override
public void onMediaPurchaseItemClick(View v) {
    navigate().toPurchaseMediaActivityForResult();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (Navigator.REQUEST_TOPICS_PURCHASE == requestCode) {
        if (RESULT_OK == resultCode) {
            dealWithSuccessfulTopicsPurchase();
        } else {
            dealWithFailedTopicsPurchase();
        }
    }        else if (Navigator.REQUEST_MEDIA_PURCHASE == requestCode) {
        if (RESULT_OK == resultCode) {
            dealWithSuccessfulMediaPurchase();
        } else {
            dealWithFailedMediaPurchase();
        }
    }
}
public void dealWithSuccessfulTopicsPurchase() {
    Log.d("Topics purchased");
    popToast("Topics purchased");
    topicsbutton.setVisibility(View.VISIBLE);
    purchasetopicsbutton.setVisibility(View.INVISIBLE);

}
private void dealWithSuccessfulMediaPurchase() {
    Log.d("Media purchased");
    popToast("Media purchased");
    mediabutton.setVisibility(View.VISIBLE);
    purchasemediabutton.setVisibility(View.INVISIBLE);

}
private void dealWithFailedTopicsPurchase() {
    Log.d("Topics purchase failed");
    popToast("Failed to purchase Topics");
}
private void dealWithFailedMediaPurchase() {
    Log.d("Media purchase failed");
    popToast("Failed to purchase Media");
}
public void TopicsOpen(View v) {
    navigate().toTopicsopen();
}
public void MediaOpen(View v) {
    navigate().toMediaopen();
}
}

PurchaseActivity.java

 public abstract class PurchaseActivity extends BlundellActivity implements OnIabSetupFinishedListener, OnIabPurchaseFinishedListener {
private IabHelper billingHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_purchase);
    setResult(RESULT_CANCELED);
    billingHelper = new IabHelper(this, AppProperties.BASE_64_KEY);
    billingHelper.startSetup(this);
}
@Override
public void onIabSetupFinished(IabResult result) {
    if (result.isSuccess()) {
        Log.d("In-app Billing set up" + result);
        dealWithIabSetupSuccess();
    } else {
        Log.d("Problem setting up In-app Billing: " + result);
        dealWithIabSetupFailure();
    }
}
protected abstract void dealWithIabSetupSuccess();
protected abstract void dealWithIabSetupFailure();
protected void purchaseItem(String sku) {
    billingHelper.launchPurchaseFlow(this, sku, 123, this);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    billingHelper.handleActivityResult(requestCode, resultCode, data);
}
@Override
public void onIabPurchaseFinished(IabResult result, Purchase info) {
    if (result.isFailure()) {
        dealWithPurchaseFailed(result);
    } else if (Items.SKU1.equals(info.getSku())) {
        dealWithTopicsPurchaseSuccess(result, info);
    }
    else if (Items.SKU2.equals(info.getSku())) {
        dealWithMediaPurchaseSuccess(result, info);
    }
    finish();
}
protected void dealWithPurchaseFailed(IabResult result) {
    Log.d("Error purchasing: " + result);
}
protected void dealWithTopicsPurchaseSuccess(IabResult result, Purchase info) {
    Log.d("Item purchased: " + result);
}
protected void dealWithMediaPurchaseSuccess(IabResult result, Purchase info) {
    Log.d("Item purchased: " + result);
    billingHelper.consumeAsync(info, null);
}
@Override
protected void onDestroy() {
    disposeBillingHelper();
    super.onDestroy();
}
private void disposeBillingHelper() {
    if (billingHelper != null) {
        billingHelper.dispose();
    }
    billingHelper = null;
}
}

【问题讨论】:

  • 您使用的是哪个应用内结算版本?

标签: android in-app-purchase in-app-billing restore


【解决方案1】:

如果您使用 API 版本 3,您可以在 onCreate() 处调用 getPurchases() 方法。

此方法返回用户当前拥有的未消费产品。

这意味着如果您的产品是不可消耗的,即用户只会购买一次,那么您将在此处获得必要的信息。

无法解释如何比官方文档做得更好。看看Querying for Purchased Items 主题有一个代码示例。

基本上,您将收到ownedSkus(拥有的产品 ID)的列表,您所要做的就是在此列表上循环,并使您的按钮不可见/可见。

如果这就是你要找的东西,请告诉我:)

【讨论】:

  • 感谢您的解释。我会尝试你解释的方式。我正在使用 IAB 3
  • 是的,我使用 API version3。我有两个产品的两个按钮。购买商品后如何永久禁用这两个按钮。但我不确定如何实现 getPurchase() 方法。当我尝试使用查询购买项目中给出的代码时。我在 mservice 收到错误,因为“无法解决 mService”。你能帮我提供更多细节吗?我需要在哪个java类中调用这个方法。你能帮我写一些代码吗
  • @user1903270,我猜有些东西不见了!你是怎么买内容的,我的意思是,你把所有可以让你买东西的代码放在哪里?
  • 其余代码与google的示例代码相同。
  • 嗯,从示例代码中更好地了解onCreate() 方法。会有一行mHelper.queryInventoryAsync(mGotInventoryListener);,这个参数是负责的侦听器,负责向您返回您需要的所有信息......查看样本的机制很容易理解。告诉我你的进展情况!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多