使用 BillingDataSource.java 的 Android 示例

Using BillingDataSource.java of Android example

我正在尝试使用

BillingDataSource.java
Security.java

来自 TrivialDriveSample 我成功购买了 Premium SKU(一次性购买) 但是我在哪里可以检查我的应用程序启动时是否购买了该产品,以便在每次应用程序启动时解锁功能 我需要从我的 MainActivity 调用一个方法来查看它是否正常

如果我问

        @Override
        public void onResume() {
            super.onResume();
            LiveData<Boolean> IsPremiumPurchased = ((MainActivity)getActivity()).billingDataSource.isPurchased(SKU_PREMIUM);
            mIsPremium = IsPremiumPurchased.getValue();
            Log.d(TAG, "User is " + (mIsPremium ? "PREMIUM" : "NOT PREMIUM"));
            ((MainActivity)getActivity()).updateUi();
        }

我得到了 由以下原因引起:java.lang.NullPointerException:尝试在空对象引用上调用虚方法 'boolean java.lang.Boolean.booleanValue()' 在 com.xxxxxxxxxxx.MainActivity$MainFragment.onResume(MainActivity.java:1302)

因为 IsPremiumPurchased 无效

As I see a sample use 实时数据和数据绑定。

来自您的代码:

((MainActivity)getActivity()).billingDataSource.isPurchased(SKU_PREMIUM)

您获得实时数据对象 IsPremiumPurchased 但实时数据提供观察模式以接收新值。这意味着通常您无法通过调用 IsPremiumPurchased.getValue() 来获取值同步,因为通过键 SKU_PREMIUM 获取值的操作是异步的,并且会在一段时间后写入 IsPremiumPurchased 。这就是为什么在您的代码段中调用 IsPremiumPurchased.getValue() returns nullAs you can see it valid behaviour). Right way to use IsPremiumPurchased - is subscribe to updates of IsPremiumPurchased like in this sample。 例如,您可以将这样的代码放入 onCreate 方法:


        final Observer<Boolean> premiumPurchasedObserver = new Observer<Boolean>() {
            @Override
            public void onChanged(@Nullable final Boolean isPurchased) {
                mIsPremium = isPurchased;
               ((MainActivity)getActivity()).updateUi();
            }
        };

        IsPremiumPurchased.observe(this, premiumPurchasedObserver);
        mIsPremium = IsPremiumPurchased.getValue();
        if(mIsPremium == null) {
            mIsPremium = false
        } 
        ((MainActivity)getActivity()).updateUi();
        

我在 IsPremiumPurchased.observe 调用后添加当前值检查以获得一致 ui 如果 premiumPurchasedObserver.onChanged 将被长时间延迟调用。

经过尝试,正确答案是

billingDataSource = new BillingDataSource( this.getApplication(),
                INAPP_SKUS, SUBSCRIPTION_SKUS, AUTO_CONSUME_SKUS);
LiveData<Boolean> IsPremiumPurchased = billingDataSource.isPurchased(SKU_PREMIUM);
final Observer<Boolean> premiumPurchasedObserver = new Observer<Boolean>() {
            @Override
            public void onChanged(@Nullable final Boolean isPurchased) {
                mIsPremium = isPurchased;
                updateUi();
                Log.d(TAG, "premiumPurchasedObserver changed");
            }
  };
IsPremiumPurchased.observe(this, premiumPurchasedObserver);```