Как приобрести каждый элемент в recyclerview с помощью покупки в приложении

#java #android #android-studio #in-app-purchase #in-app-billing

#java #Android #android-studio #покупка в приложении #выставление счетов в приложении

Вопрос:

Я пытаюсь добавить покупку в приложении для своего приложения.Проблема в том, что мне нужно приобрести каждый элемент в 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...?"   "nn" "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 amp;amp; 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

                        }
                    }
                }
            }
        });
    }
}
}
  

Я следил за этим руководством YouTube. Мне нужно совершить покупку для каждого элемента, и я подтвержду это другим руководством по тому же каналу.

И я хочу передать requests.getPhone() методу purchaseSingleClientInfo, когда покупка будет завершена.

Ответ №1:

Продукт в приложении можно приобрести только один раз, пользователь не может владеть одним и тем же продуктом более одного раза, если вы хотите, чтобы его покупали несколько раз, вам придется использовать его раньше.

Кажется, что вы хотите купить все продукты из списка сразу.

Библиотека выставления счетов в приложении не предлагает никакого способа одновременной покупки нескольких продуктов, единственный способ — один за другим через диалоговое окно, запрашивающее способ оплаты и другие опции.

Комментарии:

1. Нет, я не хочу приобретать все элементы списка сразу. Каждый элемент следует покупать независимо. Не могли бы вы, пожалуйста, помочь? я не знаю, как это сделать, сэр.

2. Следуйте инструкциям в этом документе: developer.android.com/google/play/billing/integrate