当用户进行应用内购买时移除广告
Remove ads when user makes in-app-purchase
我正在尝试实施应用内结算 API 并在用户购买 "Remove ads" 应用内购买时让我的应用没有广告。问题是我不确定在哪里做。我在 linierlayout 中有一个 FAB 按钮和 adview,如下所示:
一旦用户购买了它,我就会将广告可见性设置为“消失”,这样 FAB 按钮就会关闭。
这是我的主要 activity 代码:
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 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;
Toast.makeText(MainActivity.this,"Purchase successful",Toast.LENGTH_LONG).show();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//load ads
AdView mAdView = (AdView) findViewById(R.id.adView);
AdRequest adRequest = new AdRequest.Builder().build();
mAdView.loadAd(adRequest);
//set up billing
String publicKey = "PUBLIC_KEY";
mHelper = new IabHelper(this,publicKey);
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!");
}
});
queryPurchasedItems();
}
@Override
protected void onResume() {
super.onResume();
isListEmpty();
queryPurchasedItems();
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mHelper != null) mHelper.dispose();
mHelper = null;
}
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
}
else{
// does the user have the premium upgrade?
mIsRemoveAdds = inventory.hasPurchase(SKU_REMOVE_ADDS);
// update UI accordingly
}
}
};
}
@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);
}
}
是的,您的解决方案适合这种情况。事实上,我对 my app 使用了类似的方法,并且它适用于多个 IAP 交易。
不过有一个建议。你应该在 SharedPreferences
中坚持 mIsRemoveAdds
以防万一。完成后,当您检测到设备未连接到互联网(飞行模式,或者可能只是信号不好)时,您可以从 SharedPreferences
检索值。
除此之外,您的代码还不错。
我正在尝试实施应用内结算 API 并在用户购买 "Remove ads" 应用内购买时让我的应用没有广告。问题是我不确定在哪里做。我在 linierlayout 中有一个 FAB 按钮和 adview,如下所示:
一旦用户购买了它,我就会将广告可见性设置为“消失”,这样 FAB 按钮就会关闭。
这是我的主要 activity 代码:
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 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;
Toast.makeText(MainActivity.this,"Purchase successful",Toast.LENGTH_LONG).show();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//load ads
AdView mAdView = (AdView) findViewById(R.id.adView);
AdRequest adRequest = new AdRequest.Builder().build();
mAdView.loadAd(adRequest);
//set up billing
String publicKey = "PUBLIC_KEY";
mHelper = new IabHelper(this,publicKey);
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!");
}
});
queryPurchasedItems();
}
@Override
protected void onResume() {
super.onResume();
isListEmpty();
queryPurchasedItems();
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mHelper != null) mHelper.dispose();
mHelper = null;
}
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
}
else{
// does the user have the premium upgrade?
mIsRemoveAdds = inventory.hasPurchase(SKU_REMOVE_ADDS);
// update UI accordingly
}
}
};
}
@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);
}
}
是的,您的解决方案适合这种情况。事实上,我对 my app 使用了类似的方法,并且它适用于多个 IAP 交易。
不过有一个建议。你应该在 SharedPreferences
中坚持 mIsRemoveAdds
以防万一。完成后,当您检测到设备未连接到互联网(飞行模式,或者可能只是信号不好)时,您可以从 SharedPreferences
检索值。
除此之外,您的代码还不错。