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