微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Android - 片段内 BillingClient 的上下文

如何解决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() 也没有。

如果我在片段中,我应该传递什么上下文?

更新:

订阅片段由 SignUpFragemnt 调用

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 举报,一经查实,本站将立刻删除。