【发布时间】: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