问题描述
我想在应用首次运行时验证应用内购买,并向用户授予无广告版本的访问权限。用户已经购买了该应用程序(非消耗品)。我正在使用Google Play结算库,当用户单击“删除广告”按钮时,以下代码有效。我在个人偏好中存储了一个标记 IS_PURCHASED 以检查购买状态。重新安装该应用程序会显示广告,因为它无法设置标志,但是当我单击“删除广告”时,它会按预期显示“已购买”。
MainActivity onCreate()方法
//Method storing the flag IS_PURCHASED
setupBillingClient();
//Setup Google billing client for app's first run
if(settings.isFirstRun()) {
removeAds();
drawer.openDrawer(Gravity.LEFT);
}
Boolean isPurchased = settings.getBoolean(MainActivity.this,"IS_PURCHASED");
RelativeLayout bottomAd = findViewById(R.id.rowAdView);
if(isPurchased) {
bottomAd.setVisibility(View.GONE);
}else{
//Load banner ad
mBannerAd = (AdView) findViewById(R.id.banner_AdView);
AdRequest adRequest = new AdRequest.Builder().build();
mBannerAd.loadAd(adRequest);
}
@Override
public boolean onNavigationItemSelected(MenuItem item) {
Intent intent;
// Handle navigation view item clicks here.
int id = item.getItemId();
Intent intentExpr;
String expr;
switch (id) {
//Remove Ads and store flag IS_PURCHASED in pref
case R.id.nav_remove_ads:
removeAds();
break;
//other cases
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
方法实施
public void setupBillingClient(){
//To create a BillingClient,use newBuilder(). To receive updates on purchases,we must also call setListener(),// passing a reference to a PurchasesUpdatedListener. This listener receives updates for all purchases of this app.
billingClient = BillingClient.newBuilder(MainActivity.this).enablePendingPurchases().setListener(new PurchasesUpdatedListener() {
@Override
//This method starts when user buys a product
public void onPurchasesUpdated(BillingResult billingResult,@Nullable List<Purchase> list) {
if(list != null && billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK)
{
for(Purchase purchase : list)
{
handlePurchase(purchase);
}
}
else
{
if(billingResult.getResponseCode() == BillingClient.BillingResponseCode.USER_CANCELED)
{
Toast.makeText(MainActivity.this,"Please try purchasing again",Toast.LENGTH_SHORT).show();
}
else
{
if(billingResult.getResponseCode() == BillingClient.BillingResponseCode.ITEM_ALREADY_OWNED)
{
settings.saveBoolean(MainActivity.this,"IS_PURCHASED",true);
if(!settings.isFirstRun()) { //show msg for remove ad button click & not when reinstall
recreate(); //restart Activity to hide ads
Toast.makeText(MainActivity.this,"Already purchased",Toast.LENGTH_SHORT).show();
}
}
}
}
}
}).build();
//After you have created a BillingClient,we need to establish a connection to Google Play.
billingClient.startConnection(new BillingClientStateListener() {
@Override
public void onBillingSetupFinished(BillingResult billingResult) {
if(billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK)
{
Log.d("MainActivity","Successfully connected to Billing client");
}
else
{
Log.d("MainActivity","Failed to connect Billing client");
}
}
@Override
public void onBillingServicedisconnected() {
Log.d("MainActivity","disconnected from the Client");
}
});
}
private void handlePurchase(Purchase purchase) {
try {
//On purchase set IS_PURCHASED true
/*if(purchase.getSku().equals(productId)){
settings.saveBoolean(MainActivity.this,true);
}*/
//Get purchase ackNowledgement
if (purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED) {
settings.saveBoolean(MainActivity.this,true); //In case purchase was ackNowledge before
if (!purchase.isAckNowledged()) {
AckNowledgePurchaseParams ackNowledgePurchaseParams =
AckNowledgePurchaseParams.newBuilder()
.setPurchasetoken(purchase.getPurchasetoken())
.build();
AckNowledgePurchaseResponseListener ackNowledgePurchaseResponseListener = new AckNowledgePurchaseResponseListener() {
@Override
public void onAckNowledgePurchaseResponse(BillingResult billingResult) {
settings.saveBoolean(MainActivity.this,true);
recreate(); //restart activity on ackNowledgement of purchase
Toast.makeText(MainActivity.this,"Purchase successful! Enjoy the Ad-Free version",Toast.LENGTH_SHORT).show();
}
};
billingClient.ackNowledgePurchase(ackNowledgePurchaseParams,ackNowledgePurchaseResponseListener);
}else{
recreate(); //restart activity if already ackNowledged
}
}
}
catch (Exception e)
{
Log.d(TAG,e.getMessage());
Toast.makeText(this,e.getMessage(),Toast.LENGTH_SHORT).show();
}
}
public void removeAds(){
skulist.add(productId);
final SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
params.setSkusList(skulist).setType(BillingClient.SkuType.INAPP);
billingClient.querySkuDetailsAsync(params.build(),new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(BillingResult billingResult,List<SkuDetails> list) {
if(list != null && billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK)
{
for(final SkuDetails skuDetails : list)
{
String sku = skuDetails.getSku(); // your Product id
String price = skuDetails.getPrice(); // your product price
String description = skuDetails.getDescription(); // product description
//method opens Popup for billing purchase
BillingFlowParams flowParams = BillingFlowParams.newBuilder()
.setSkuDetails(skuDetails)
.build();
BillingResult responsecode = billingClient.launchBillingFlow(MainActivity.this,flowParams);
}
}
}
});
}
还建议是否有其他比这更好的方法。
谢谢!
解决方法
好,我找到了解决方案。您可以使用 queryPurchases 方法检查已购买的应用。我也在错误的地方设置了标志。如果有人遇到相同的问题,请在 onBillingSetupFinished
中调用以下方法 //Check already purchases using queryPurchases
private boolean isAlreadyPurchased() {
if (billingClient.isReady()) {
Purchase.PurchasesResult purchasesResult = billingClient.queryPurchases(BillingClient.SkuType.INAPP);
List<Purchase> purchases = purchasesResult.getPurchasesList();
for (Purchase pur : purchases) {
String thisSku = pur.getSku();
if (thisSku.equals(sku)) {
return true;
}
}
}
return false;
}