使用 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 null
(As 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);```
我正在尝试使用
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 null
(As 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);```