Java 应用内计费,在文本上显示本地化价格

Java 应用内计费,在文本上显示本地化价格,java,android,Java,Android,在我的android应用程序中,我想在按钮上显示应用程序内购买的本地化价格。 我试着按照一个指南来设置应用内账单()来设置账单本身,它似乎在一个测试帐户上工作 尽管.setSku和.setType现在已被弃用,但现在可以使用.setSku详细信息,这在文档中非常有用,因为有很多选项但是,我似乎无法访问SkuDetails类 几周来,我一直在尝试实施应用内计费,并查看了各种文章和指南,但似乎找不到解决方法。我觉得我什么都试过了,不知道下一步该怎么办 public class InAppBillin

在我的android应用程序中,我想在按钮上显示应用程序内购买的本地化价格。 我试着按照一个指南来设置应用内账单()来设置账单本身,它似乎在一个测试帐户上工作
尽管.setSku和.setType现在已被弃用,但现在可以使用.setSku详细信息,这在文档中非常有用,因为有很多选项
但是,我似乎无法访问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();
        }

    });


}
应用计费中的公共类扩展了应用活动实现 PurchasesUpdatedListener{ 私有静态最终字符串TAG=“InAppBilling”; //应用内产品 静态最终字符串项\u SKU\u ADREMOVAL=“删除广告\u薪水1”; 私人按钮; 私人按钮返回按钮; 私人字符串价格; 私人共享参考mSharedPreferences; 私人计费客户mBillingClient; @凌驾 创建时受保护的void(@Nullable Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.inappbilling); mBillingClient=BillingClient.newBuilder(InAppBilling.this).setListener(this.build(); mBillingClient.startConnection(新的BillingClientStateListener(){ @凌驾 已完成BillingSetupFinished(int响应代码)上的公共无效{ if(responseCode==BillingClient.BillingResponse.OK){ List skuList=new ArrayList(); skuList.添加(项目\u SKU\u ADREMOVAL); SkuDetailsParams.Builder params=SkuDetailsParams.newBuilder(); 参数setskulist(skuList).setType(BillingClient.SkuType.INAPP); mBillingClient.querySkuDetailsAsync(params.build(), 新SkuDetailsResponseListener(){ @凌驾 公共无效onSkuDetailsResponse(内部响应代码,列表skuDetailsList){ //如果代码=OK且skuDetailsList不=null(空),则处理响应 if(responseCode==BillingClient.BillingResponse.OK&&skuDetailsList!=null){ 用于(SkuDetails SkuDetails:skuDetailsList){ 字符串sku=skuDetails.getSku(); 字符串price=skuDetails.getPrice(); 如果(项目库存单位等于库存单位){ mAdRemovalPrice=价格; } } } } }); } } @凌驾 公共无效onBillingServiceDisconnected(){ //实施重试策略-通过调用startConnection()尝试在下一个请求时重新启动 } }); mButton=findviewbyd(R.id.buy_按钮); mButton.setOnClickListener(新视图.OnClickListener(){ @凌驾 公共void onClick(视图){ BillingFlowParams flowParams=BillingFlowParams.newBuilder() //此skuDetails给出错误“无法解析符号” .详细信息(SKU详细信息) //.setSku(项目_SKU _ADREMOVAL) //.setType(BillingClient.SkuType.INAPP) .build(); int responseCode=mBillingClient.launchBillingFlow(InAppBilling.this,flowParams); } }); 后退按钮=findViewById(R.id.后退按钮); 后退按钮.setOnClickListener(新视图.OnClickListener(){ @凌驾 公共void onClick(视图){ //返回,直到找到碎片 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()
    }
}
应用计费中的公共类扩展了应用活动实现 PurchasesUpdatedListener、SkuDetailsResponseListener、, BillingClientStateListener,View.OnClickListener { 私有静态最终字符串TAG=“InAppBilling”; //应用内产品 静态最终字符串项\u SKU\u ADREMOVAL=“删除广告\u薪水1”; 私人按钮; 私人按钮返回按钮; 私人字符串价格; 私人共享参考mSharedPreferences; 私人计费客户mBillingClient; @凌驾 创建时受保护的void(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.inappbilling); mBillingClient=BillingClient.newBuilder(this.setListener)(this.build(); mBillingClient.startConnection(此); findviewbyd(R.id.buy_按钮); findviewbyd(R.id.back_按钮); } @凌驾 公共无效onPurchasesUpdated(int responseCode,@Nullable List purchases) { } @凌驾 公共无效onSkuDetailsResponse(内部响应代码,列表skuDetailsList) { if(responseCode==BillingClient.BillingResponse.OK&&skuDetailsList!=null) { 用于(臭鼬)