如何解决Android - 片段内 BillingClient 的上下文
我有一个活动应用程序 (java),其中一个片段包含订阅按钮。我正在设置 Google Play 结算库,但在设置以下内容时:
private BillingClient billingClient = BillingClient.newBuilder(getActivity())
.setListener(purchasesUpdatedListener)
.enablePendingPurchases()
.build();
我收到此错误:
java.lang.IllegalArgumentException: Please provide a valid Context.
at com.android.billingclient.api.BillingClient$Builder.build
我也试过
getContext()
和
getActivity.getApplicationContext()
但也没有用。 requireContext() 也没有。
如果我在片段中,我应该传递什么上下文?
更新:
public class SignUpFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_sign_up,container,false);
Button nextButton = v.findViewById(R.id.nextButton);
nextButton.setonClickListener(v1 -> {
Navigation.findNavController(v1).navigate(R.id.subscriptionV3Fragment);
});
return v;
}
}
这是订阅片段:
public class SubscriptionV3Fragment extends Fragment implements View.OnClickListener {
private static final String TAG = "SubscriptionV3Fragment";
SkuDetails monthlyDetails;
SkuDetails annualDetails;
Context context = getActivity();
private PurchasesUpdatedListener purchasesUpdatedListener = new PurchasesUpdatedListener() {
@Override
public void onPurchasesUpdated(@NonNull BillingResult billingResult,@Nullable List<Purchase> list) {
}
};
private BillingClient billingClient = BillingClient.newBuilder(requireContext())
.setListener(purchasesUpdatedListener)
.enablePendingPurchases()
.build();
@Override
public View onCreateView(LayoutInflater inflater,Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_subscription_v3,false);
startConnection();
Button monthlySubscribe = v.findViewById(R.id.monthlySubscribeBut);
monthlySubscribe.setonClickListener(this);
return v;
}
private void startConnection() {
billingClient.startConnection(new BillingClientStateListener() {
@Override
public void onBillingServicedisconnected() {
// PENDING
// Try to restart the connection on the next request to
// Google Play by calling the startConnection() method.
}
@Override
public void onBillingSetupFinished(@NonNull BillingResult billingResult) {
if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
querySubscriptionProducts();
}
}
});
}
private void querySubscriptionProducts() {
List<String> skuList = new ArrayList<>();
skuList.add("sub_monthly");
skuList.add("sub_annual");
SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
params.setSkusList(skuList).setType(BillingClient.SkuType.SUBS);
billingClient.querySkuDetailsAsync(params.build(),new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(@NonNull BillingResult billingResult,@Nullable List<SkuDetails> list) {
Log.d(TAG,"onSkuDetailsResponse: " + list);
}
});
}
}
解决方法
在这种情况下,问题不在于 context
,而是从哪里访问它。当这部分代码被调用时,FragmentLifeCycle 的其他方法仍在工作。
private BillingClient billingClient = BillingClient.newBuilder(requireContext())
.setListener(purchasesUpdatedListener)
.enablePendingPurchases()
.build();
我建议你在 OnCreateView()
之后向下移动它,或者在 onViewCreated()
内部更好
只需将其分配到顶部
private BillingClient billingClient;
然后在 onViewCreated()
内你可以这样做
billingClient = BillingClient.newBuilder(requireContext())
.setListener(purchasesUpdatedListener)
.enablePendingPurchases()
.build();
,
用 getContext() 改变 getActivity()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。