【问题标题】:In-App Billing, show localized price on text应用内结算,在文本上显示本地化价格
【发布时间】:2019-04-18 05:32:43
【问题描述】:

在我的 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()。

【问题讨论】:

  • 您能解释一下为什么不能使用 getPrice() 吗?你的意思是你得到一个空字符串?您的代码表明您得到了它: String price = skuDetails.getPrice();
  • @PerracoLabs 是的,我的错。我实际上可以使用它,在那一行中,问题是,在 OnSkuDetailsResponse 方法之外,我无法访问它。我想写一行 mButton.setText() = SkuDetails.getPrice();但它不允许我

标签: java android


【解决方案1】:

让你的activity实现监听器,然后你就可以更轻松地访问所有内容。

我重新格式化了你的代码来实现你所有的监听器,它可能有一些小错误,但我希望你明白。

请注意,我还实现了 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()
    }
}

【讨论】:

    猜你喜欢
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    相关资源
    最近更新 更多