#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