【问题标题】:How to verify user purchase for a non-consumable product on app launch如何在应用启动时验证用户购买非消耗性产品
【发布时间】:2019-10-20 18:43:25
【问题描述】:

我刚刚使用 google play billing withaidl 完成了应用内计费的设置。 成功购买后,高级功能通过布尔值激活。但是在应用程序关闭并重新启动后,高级功能就会消失。即布尔值恢复为假。我想知道如何确保在应用启动后,只要购买了溢价,布尔值就保持不变。

在 MainActivity 上

    public class MainActivity extends AppCompatActivity {

public static boolean proFeature = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

}

关于 InAppBilling 活动

    public class InAppBilling extends Activity implements IabBroadcastReceiver.IabBroadcastListener {
private static final String TAG = ".InAppBilling";

IabHelper mHelper;
boolean premiumFeature = false;
static final String SKU_PREMIUM = "android.test.purchased";
static final int RC_REQUEST = 10001;
IabBroadcastReceiver mBroadcastReceiver;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.test_lay);

}

    IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
    @Override
    public void onQueryInventoryFinished(IabResult result, Inventory inv) {
        Log.d(TAG, "Query inventory finished.");

        if (mHelper == null) return;

        if (result.isFailure()) {
            complain("Failed to query inventory: " + result);
            return;
        }

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

        Purchase premiumPurchase = inv.getPurchase(SKU_PREMIUM);
        premiumFeature = (premiumPurchase != null && verifyDeveloperPayload(premiumPurchase));
        Log.d(TAG, "User is " + (premiumFeature ? "PREMIUM" : "NOT PREMIUM"));

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

    IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
    @Override
    public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
        Log.d(TAG, "Purchase finished: " + result + ", purchase: " + purchase);

        if (mHelper == null) return;

        if (result.isFailure()) {
            complain("Error purchasing: " + result);
            setWaitScreen(false);
            return;
        }
        if (!verifyDeveloperPayload(purchase)) {
            complain("Error purchasing. Authenticity verification failed.");
            setWaitScreen(false);
            return;
        }

        Log.d(TAG, "Purchase successful.");

        if (purchase.getSku().equals(SKU_PREMIUM)) {
            // bought the premium upgrade!
            Log.d(TAG, "Purchase is premium upgrade. Congratulating user.");
            alert("Thank you for upgrading to premium!");
            premiumFeature = true;
            updateUi();
            setWaitScreen(false);
        }

    }
};

    public void updateUi(){
    button.setVisibility(premiumFeature ? View.GONE : View.VISIBLE);
    if (premiumFeature){
        MainActivity.proFeature = true;
    }else{
    MainActivity.proFeature = false;
    }
}

【问题讨论】:

    标签: java android in-app-purchase verify


    【解决方案1】:

    在您的购买完成监听器中,修改以下代码以将值存储到共享偏好中。

           if (purchase.getSku().equals(SKU_PREMIUM)) {
                // bought the premium upgrade!
                Log.d(TAG, "Purchase is premium upgrade. Congratulating user.");
                alert("Thank you for upgrading to premium!");
                premiumFeature = true;
    
                SharedPreferences sharedPref = context.getSharedPreferences(
                      "my_sp", Context.MODE_PRIVATE);
                sharedPref.edit().putBoolean("isPremium, premiumFeature).commit();
    
                updateUi();
                setWaitScreen(false);
            }
    

    在应用重新启动时,再次从共享偏好中获取此值。

    SharedPreferences sharedPref = context.getSharedPreferences(
                          "my_sp", Context.MODE_PRIVATE);
    premiumFeature = sharedPref.getBoolean("isPremium, false);
    

    【讨论】:

      【解决方案2】:

      您可以将其保存到共享首选项或服务器上,并在开始时查询状态(启动画面)。

      或者您可以在闪屏中进行库存查询以检查闪屏中的状态。

      【讨论】:

      • 我没有应用服务器。有没有办法将存储在 SharedPreferences 上的数据保存到我的 firebase 数据库中,然后在用户重新安装应用程序或获取其他设备时从数据库中读取值。或者你能告诉我在启动屏幕上进行库存查询的代码吗?
      • 检查 dhaval 的回答将其添加到您的启动画面中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多