I am trying to use the in-app-billing API for the first time. I have tested the app with a different account and the payment went through and the ads were removed from the app. However, when I destroyed the app and they launching it again the ads were present again. I dont understand what I am doing wrong. Please does anybody has a suggestion?
This is my code in main acticity:
public class MainActivity extends AppCompatActivity {
private static final String TAG = MainActivity.class.getSimpleName();
private Toolbar mToolbar;
private RecyclerView mRecyclerView;
private ArrayList<String> shoppingListItems;
private SharedPreferences mSharedPreferences;
private SharedPreferences.Editor mEditor;
private TextView mEmptyTextView;
private ShoppingListAdapter adapter;
private ActionButton actionButton;
private MaterialDialog addItemdialog = null;
private AdView mAdView;
private IabHelper mHelper;
private String SKU_REMOVE_ADDS = "remove_adds_sku";
private boolean mIsRemoveAdds = false;
private IabHelper.OnIabPurchaseFinishedListener mPurchasedFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
@Override
public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
if (result.isFailure()) {
Log.d(TAG, "Error purchasing: " + result);
return;
}
else if (purchase.getSku().equals(SKU_REMOVE_ADDS)) {
// consume the gas and update the UI
mIsRemoveAdds = true;
mAdView.setVisibility(View.GONE);
Toast.makeText(MainActivity.this,"Purchase successful",Toast.LENGTH_LONG).show();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mEmptyTextView = (TextView)findViewById(R.id.list_empty);
mEmptyTextView.setVisibility(View.INVISIBLE);
mSharedPreferences = getPreferences(MODE_PRIVATE);
mEditor = mSharedPreferences.edit();
queryPurchasedItems();
//load ads
if(!mIsRemoveAdds) {
mAdView = (AdView) findViewById(R.id.adView);
AdRequest adRequest = new AdRequest.Builder().build();
mAdView.loadAd(adRequest);
}else{
mAdView.setVisibility(View.GONE);
}
String publicKey = s1+s2+s3+s4+s5;
mHelper = new IabHelper(this,publicKey);
if(mHelper != null) {
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
@Override
public void onIabSetupFinished(IabResult result) {
if (!result.isSuccess()) {
//error
Log.d(TAG, "Proglem setting up in-app Billing: " + result);
}
//Horay, IAB is fully set up!
Log.d(TAG, "Horay, IAB is fully set up!");
}
});
}
}
private void queryPurchasedItems() {
//check if user has bought "remove adds"
IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
@Override
public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
if (result.isFailure()) {
// handle error here
Toast.makeText(MainActivity.this,"error",Toast.LENGTH_LONG).show();
}
else{
// does the user have the premium upgrade?
mIsRemoveAdds = inventory.hasPurchase(SKU_REMOVE_ADDS);
if(!mIsRemoveAdds){
Toast.makeText(MainActivity.this,"no premium",Toast.LENGTH_LONG).show();
}
// update UI accordingly
Toast.makeText(MainActivity.this,"premium",Toast.LENGTH_LONG).show();
}
}
};
}
@Override
protected void onResume() {
super.onResume();
queryPurchasedItems();
//Toast.makeText(MainActivity.this,"On Resume",Toast.LENGTH_LONG).show();
//read isRemoveAdds from shared preferences
//mIsRemoveAdds = mSharedPreferences.getBoolean(Constants.IS_REMOVE_ADDS,false);
if(!mIsRemoveAdds) {
mAdView = (AdView) findViewById(R.id.adView);
AdRequest adRequest = new AdRequest.Builder().build();
mAdView.loadAd(adRequest);
}else{
mAdView.setVisibility(View.GONE);
}
isListEmpty();
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mHelper != null) mHelper.dispose();
mHelper = null;
mAdView.destroy();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(id == R.id.action_remove_adds){
mHelper.launchPurchaseFlow(this,SKU_REMOVE_ADDS,1,mPurchasedFinishedListener,"");
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d(TAG, "onActivityResult(" + requestCode + "," + resultCode + "," + data);
// Pass on the activity result to the helper for handling
if (!mHelper.handleActivityResult(requestCode, resultCode, data)) {
// not handled, so handle it ourselves (here's where you'd
// perform any handling of activity results not related to in-app
// billing...
//setContentView(R.layout.activity_main_adds);
super.onActivityResult(requestCode, resultCode, data);
}
else {
Log.d(TAG, "onActivityResult handled by IABUtil.");
//setContentView(R.layout.activity_main_adds);
}
}
You need to move your if statement
to
onQueryInventoryFinished
. This is because you're displaying ads before the app has a chance to check if the user has purchased the upgrade, and then after the check is complete, you never hide the ads again.So, remove the above if statement from your
onCreate
andonResume
method and format youronQueryInventoryFinished
method like so:Disclaimer I've never worked with the purchases api before, so this exact code may not work, but the general idea that you're not hiding the ads after checking for the purchase is right.