В моем приложении для Android я хочу отобразить локализованную цену для покупки в приложении на кнопке. Я пытался следовать руководству, чтобы настроить биллинг в приложении (https://medium.com/@patpatchpatrick/adding-the-google-play-billing-library-to-your-application-fbeb9ec03151) для настройки Сам биллинг, и, похоже, работает на тестовом аккаунте.
Хотя .setSku и .setType теперь устарели, и теперь нужно использовать .setSkuDetails, что из документации отлично, так как вариантов много.
Однако я не могу получить доступ к классу SkuDetails..
В течение нескольких недель я пытался внедрить биллинг в приложениях и просматривал различные статьи и руководства, но, похоже, не могу найти в этом пути. Я чувствую, что перепробовал все и не знаю, куда обратиться.
public class InAppBilling extends AppCompatActivity implements
PurchasesUpdatedListener {
private static final String TAG = "InAppBilling";
//In APP Produkter
static final String ITEM_SKU_ADREMOVAL = "remove_ads_salary1";
private Button mButton;
private Button back_Button;
private String mAdRemovalPrice;
private SharedPreferences mSharedPreferences;
private BillingClient mBillingClient;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.inappbilling);
mBillingClient = BillingClient.newBuilder(InAppBilling.this).setListener(this).build();
mBillingClient.startConnection(new BillingClientStateListener() {
@Override
public void onBillingSetupFinished(int responseCode) {
if (responseCode == BillingClient.BillingResponse.OK){
List skuList = new ArrayList<>();
skuList.add(ITEM_SKU_ADREMOVAL);
SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
params.setSkusList(skuList).setType(BillingClient.SkuType.INAPP);
mBillingClient.querySkuDetailsAsync(params.build(),
new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(int responseCode, List<SkuDetails> skuDetailsList) {
//Processing the response if the code = OK, and skuDetailsList isn't = null(empty)
if (responseCode == BillingClient.BillingResponse.OK && skuDetailsList != null){
for (SkuDetails skuDetails : skuDetailsList){
String sku = skuDetails.getSku();
String price = skuDetails.getPrice();
if (ITEM_SKU_ADREMOVAL.equals(sku)){
mAdRemovalPrice = price;
}
}
}
}
});
}
}
@Override
public void onBillingServiceDisconnected() {
// IMPLEMENT RETRY POLICY - TRY TO RESTART ON NEXT REQUEST BY CALLING startConnection()
}
});
mButton = findViewById(R.id.buy_button);
mButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view){
BillingFlowParams flowParams = BillingFlowParams.newBuilder()
//THIS skuDetails gives the error 'Cannot resolve symbol
.setSkuDetails(skuDetails)
// .setSku(ITEM_SKU_ADREMOVAL)
// .setType(BillingClient.SkuType.INAPP)
.build();
int responseCode = mBillingClient.launchBillingFlow(InAppBilling.this, flowParams);
}
});
back_Button = findViewById(R.id.back_button);
back_Button.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view){
//Returnere til det fragment man kom fra
InAppBilling.super.onBackPressed();
}
});
}
Ну, я хотел бы получить доступ через SkuDetails, поэтому я могу использовать его метод getPrice(), чтобы показать локализованные цены, для моего приложения.
Сейчас я не могу использовать getPrice().
Сделайте свою деятельность для реализации слушателей, тогда вы сможете получить доступ ко всему более легко.
Я переформатировал ваш код для реализации всех ваших слушателей, и в нем могут быть небольшие ошибки, но я надеюсь, что вы поняли идею.
Обратите внимание, что я также реализовал View.OnClickListener, который делает код более понятным, но вам нужно будет назначить на уровне модуля переменную для skuDetails, передаваемых сборщику, чего я не делал. Дайте знать, если у вас появятся вопросы.
public class InAppBilling extends AppCompatActivity implements
PurchasesUpdatedListener, SkuDetailsResponseListener,
BillingClientStateListener, View.OnClickListener
{
private static final String TAG = "InAppBilling";
//In APP Produkter
static final String ITEM_SKU_ADREMOVAL = "remove_ads_salary1";
private Button mButton;
private Button back_Button;
private String mAdRemovalPrice;
private SharedPreferences mSharedPreferences;
private BillingClient mBillingClient;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.inappbilling);
mBillingClient = BillingClient.newBuilder(this).setListener(this).build();
mBillingClient.startConnection(this);
findViewById(R.id.buy_button).setOnClickListener(this);
findViewById(R.id.back_button).setOnClickListener(this);
}
@Override
public void onPurchasesUpdated(int responseCode, @Nullable List<Purchase> purchases)
{
}
@Override
public void onSkuDetailsResponse(int responseCode, List<SkuDetails> skuDetailsList)
{
if (responseCode == BillingClient.BillingResponse.OK && skuDetailsList != null)
{
for (SkuDetails skuDetails : skuDetailsList)
{
String sku = skuDetails.getSku();
String price = skuDetails.getPrice();
if (ITEM_SKU_ADREMOVAL.equals(sku))
{
mAdRemovalPrice = price;
}
}
}
}
@Override
public void onClick(View view)
{
if (view.getId() == R.id.back_button)
{
super.onBackPressed();
}
else if (view.getId() == R.id.buy_button)
{
BillingFlowParams flowParams = BillingFlowParams.newBuilder()
.setSkuDetails(skuDetails)
.build();
int responseCode = mBillingClient.launchBillingFlow(this, flowParams);
}
}
@Override
public void onBillingSetupFinished(int responseCode)
{
if (responseCode == BillingClient.BillingResponse.OK)
{
List skuList = new ArrayList<>();
skuList.add(ITEM_SKU_ADREMOVAL);
SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
params.setSkusList(skuList).setType(BillingClient.SkuType.INAPP);
mBillingClient.querySkuDetailsAsync(params.build(), this);
}
}
@Override
public void onBillingServiceDisconnected()
{
// IMPLEMENT RETRY POLICY - TRY TO RESTART ON NEXT REQUEST BY CALLING startConnection()
}
}