Java 我如何使用base64进行应用内计费?我需要它吗?
我已经尝试编程一个工作车间系统好几天了,但是我看到计费客户端没有连接。 此处的Toast消息是连接到帐单时出错 错在哪里 我需要帮助课程吗?在许多说明中,都说可以使用帮助类,但不一定要使用 如果购买了Aktikel,那么有哪种可能性可以对每篇文章执行另一个代码 我想提供六个用户可以购买的数字产品 谢谢你的帮助 这是我的ShopActivity.class代码: AIDL不推荐使用Java 我如何使用base64进行应用内计费?我需要它吗?,java,android,android-pay,android-billing,Java,Android,Android Pay,Android Billing,我已经尝试编程一个工作车间系统好几天了,但是我看到计费客户端没有连接。 此处的Toast消息是连接到帐单时出错 错在哪里 我需要帮助课程吗?在许多说明中,都说可以使用帮助类,但不一定要使用 如果购买了Aktikel,那么有哪种可能性可以对每篇文章执行另一个代码 我想提供六个用户可以购买的数字产品 谢谢你的帮助 这是我的ShopActivity.class代码: AIDL不推荐使用 public class ShopActivity extends AppCompatActivity implem
public class ShopActivity extends AppCompatActivity implements PurchasesUpdatedListener {
private BillingClient billingClient;
Button loadProdukt;
RecyclerView recyclerProdukt;
// IabHelper mHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_shop);
// String base64EncodedPublicKey = "_BASE64_KEY_";
// mHelper = new IabHelper(this, base64EncodedPublicKey);
// TODO 01.07.2019 IabHelper?
setupBillingClient();
loadProdukt = findViewById(R.id.btn_load_produkt);
recyclerProdukt = findViewById(R.id.recycler_view_paket);
recyclerProdukt.setHasFixedSize(true);
recyclerProdukt.setLayoutManager(new LinearLayoutManager(this));
// event
loadProdukt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(billingClient.isReady()){
SkuDetailsParams params = SkuDetailsParams.newBuilder()
.setSkusList(Arrays.asList("10_coins","20_coins","30_coins","40_coins","80_coins","200_coins"))
.setType(BillingClient.SkuType.INAPP)
.build();
billingClient.querySkuDetailsAsync(params, new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(BillingResult billingResult, List<SkuDetails> skuDetailsList) {
if (billingResult.getResponseCode() == BilllingResonse.OK) {
loadProduktToRecyclerView(skuDetailsList);
}else{
Toast.makeText(ShopActivity.this, "Cannot query product", Toast.LENGTH_SHORT).show();
}
}
});
}else{
Toast.makeText(ShopActivity.this, "Billing not ready", Toast.LENGTH_SHORT).show();
}
}
});
}
private void loadProduktToRecyclerView(List<SkuDetails> skuDetailsList) {
ProduktAdapter adapter = new ProduktAdapter(this, skuDetailsList,billingClient);
recyclerProdukt.setAdapter(adapter);
}
private void setupBillingClient() {
// billingClient = BillingClient.newBuilder(this).enablePendingPurchases().setListener(this).build();
billingClient = BillingClient.newBuilder(this).setListener(this).build();
billingClient.startConnection(new BillingClientStateListener() {
@Override
public void onBillingSetupFinished(BillingResult billingResult) {
if (billingResult.getResponseCode() == BilllingResonse.OK) {
Toast.makeText(ShopActivity.this, "Success to connect Billing", Toast.LENGTH_SHORT).show();
}
else {
Toast.makeText(ShopActivity.this, "Error not connect to Billing", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onBillingServiceDisconnected() {
Toast.makeText(ShopActivity.this, "You are disconnect.", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onPurchasesUpdated(BillingResult billingResult, @Nullable List<Purchase> purchases) {
// if user click Buy, we will retrieve data here
Toast.makeText(this, "Purchase item: "+purchases.size(), Toast.LENGTH_SHORT).show();
if (billingResult.getResponseCode() == BillingResponse.OK && purchases != null) {
for ( Purchase purchases : purchases) {
handlePurchase (purchases);
}
}else if (billingResult.getResponseCode() == BillingResponse.USER_CANCELED) {
}else{
}
}
}