【问题标题】:How to purchase each item in recyclerview with in-app purchase如何通过应用内购买购买 recyclerview 中的每件商品
【发布时间】:2020-12-05 02:02:39
【问题描述】:

我正在尝试为我的应用添加应用内购买。问题是我需要为 recyclerview 中的每个项目购买。

private RecyclerView recyclerView;

//Billing
private BillingClient billingClient;
private List skuList = new ArrayList();
private String sku = "sk_peoplesio_new_connection";
SkuDetails skuDetails ;


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

    Button button = findViewById(R.id.freelancer_purchased_order_btn);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startActivity(new Intent(FreelancerOrderActivity.this,FreelancerPurchasedOrderActivity.class));
        }
    });
    recyclerView = findViewById(R.id.freelancer_order_list);
    recyclerView.setHasFixedSize(false);
    LinearLayoutManager layoutManager = new LinearLayoutManager(this);
    layoutManager.setReverseLayout(true);
    layoutManager.setStackFromEnd(true);
    recyclerView.setLayoutManager(layoutManager);

    Toast.makeText(this, "Long press on the item to view their request's...!", Toast.LENGTH_LONG).show();


    //Billing
    skuList.add(sku);

    setupBillingClient();
}


@Override
protected void onStart() {
    super.onStart();

    final DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("FreelancerOrders").child(Freevalent.currentOnlineFreelancer.getPhone());

    FirebaseRecyclerOptions<ClientOrders> options =
            new FirebaseRecyclerOptions.Builder<ClientOrders>()
                    .setQuery(reference,ClientOrders.class)
                    .build();

    FirebaseRecyclerAdapter<ClientOrders, TextViewHolder> adapter =
            new FirebaseRecyclerAdapter<ClientOrders, TextViewHolder>(options) {
                @Override
                protected void onBindViewHolder(@NonNull final TextViewHolder  textViewHolder, int i, @NonNull final ClientOrders requests) {

                    textViewHolder.name.setText("Do you want this order...?" + "\n\n"+"Long press to see the client's  requests's");


                    textViewHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
                        @Override
                        public boolean onLongClick(View v) {
                            Intent i = new Intent(FreelancerOrderActivity.this,FreelancerParticularClientActivity.class);
                            i.putExtra("phone",requests.getPhone());
                            startActivity(i);
                            return true;
                        }
                    });

                    textViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            AlertDialog.Builder builder = new AlertDialog.Builder(FreelancerOrderActivity.this);
                            builder.setTitle("Do you want to buy this Connection...?")
                                    .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                                        @Override
                                        public void onClick(DialogInterface dialog, int which) {
                                            reference.child(requests.getUnique()).removeValue()
                                                    .addOnCompleteListener(new OnCompleteListener<Void>() {
                                                        @Override
                                                        public void onComplete(@NonNull Task<Void> task) {

                                                            //Billing
                                                            BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
                                                                    .setSkuDetails(skuDetails).build();
                                                            billingClient.launchBillingFlow(FreelancerOrderActivity.this,billingFlowParams);


                                                            new CountDownTimer(180000000,1000)
                                                            {

                                                                @Override
                                                                public void onTick(long millisUntilFinished) {
                                                                    textViewHolder.name.setText("Seconds Remaining : " + millisUntilFinished/1000);
                                                                }

                                                                @Override
                                                                public void onFinish() {
                                                                    purchaseSingleClientInfo(requests.getPhone());
                                                                }
                                                            }.start();





                                                        }
                                                    });
                                        }
                                    }).setNegativeButton("No", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    dialog.dismiss();
                                }
                            }).show();
                        }
                    });


                }

                @NonNull
                @Override
                public TextViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.request_item_layout,parent,false);
                    TextViewHolder holder = new TextViewHolder(view);
                    return holder;
                }
            };

    recyclerView.setAdapter(adapter);
    adapter.startListening();
}

private void purchaseSingleClientInfo(String phone)
{
    final DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("FreelancerOrders").child(Freevalent.currentOnlineFreelancer.getPhone());
    final DatabaseReference clientRef = FirebaseDatabase.getInstance().getReference().child("ClientOrders").child(phone).child(Freevalent.currentOnlineFreelancer.getPhone());
    clientRef.child("state").setValue("t");
    reference.child(phone).child("state").setValue("t");
    Toast.makeText(FreelancerOrderActivity.this, "Click the Button below..!", Toast.LENGTH_SHORT).show();

}

//Billing
@Override
public void onPurchasesUpdated(@NonNull BillingResult billingResult, @Nullable List<Purchase> purchases) {
    int responseCode = billingResult.getResponseCode();
    if(responseCode == BillingClient.BillingResponseCode.OK && purchases!=null)
    {
        for(Purchase purchase : purchases)
        {
            handlePurchase(purchase);
        }
    }
    else if(responseCode == BillingClient.BillingResponseCode.ITEM_ALREADY_OWNED)
    {

    }
    else if(responseCode == BillingClient.BillingResponseCode.USER_CANCELED)
    {

    }

}

private void handlePurchase(Purchase purchase) {
    if(purchase.getSku().equals(sku))
    {
        Toast.makeText(this, "Purchase Done...!", Toast.LENGTH_SHORT).show();

    }
}

private void setupBillingClient() {

    billingClient = BillingClient.newBuilder(this).enablePendingPurchases().setListener(this).build();
    billingClient.startConnection(new BillingClientStateListener() {
        @Override
        public void onBillingSetupFinished(@NonNull BillingResult billingResult) {
            if(billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK)
            {
                //The billing client is setup successfully
                loadAllSkus();
            }
        }

        @Override
        public void onBillingServiceDisconnected() {
            //Try to restart the connection on the next request to Google play by calling the start Connection method.
        }
    });

}

private void loadAllSkus()
{
    if(billingClient.isReady())
    {
        SkuDetailsParams params = SkuDetailsParams.newBuilder()
                .setSkusList(skuList)
                .setType(BillingClient.SkuType.INAPP)
                .build();

        billingClient.querySkuDetailsAsync(params, new SkuDetailsResponseListener() {
            @Override
            public void onSkuDetailsResponse(@NonNull BillingResult billingResult, @Nullable List<SkuDetails> list) {
                if(billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK)
                {
                    for(Object skuDetailsObject : list )
                    {
                        skuDetails = (SkuDetails) skuDetailsObject;
                        if(skuDetails.getSku().equals(sku))
                        {

                        }
                        else if(skuDetails.getSku().equals("something_else"))
                        {
                            //do this

                        }
                    }
                }
            }
        });
    }
}
}

我关注了this youtube tutorial。我需要为每件商品进行购买,我会在同一频道的其他教程中确认。

我想在购买完成后将 requests.getPhone() 传递给 purchaseSingleClientInfo 方法。

【问题讨论】:

    标签: java android android-studio in-app-purchase in-app-billing


    【解决方案1】:

    一个应用内商品只能购买一次,用户不能拥有多个相同的商品,如果你想多次购买,你必须先消费。

    您似乎想一次购买清单上的所有产品。

    应用内计费库不提供同时购买多个产品的任何方法,唯一的方法是通过询问付款方式和其他选项的对话框逐个进行。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-09
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多