I am trying to show admob interstitial ad at the end of the application when user presses back button from the main activity. Ad is shown, but the ad is not clickable. My code is
I put loading part at the activity onCreate :
interstitial = new InterstitialAd(getApplicationContext());
interstitial.setAdUnitId("Ad UNIT ID");
// Create ad request.
AdRequest adRequest = new AdRequest.Builder()
.addTestDevice(AdRequest.DEVICE_ID_EMULATOR).build();
// Begin loading your interstitial.
interstitial.loadAd(adRequest);
and in OnBackPressed :
#Override
public void onBackPressed() {
super.onBackPressed();
displayInterstitial();
}
protected void displayInterstitial() {
Log.d(TAG, "start displayInterstitial()");
if (null != interstitial && interstitial.isLoaded()) {
Log.d(TAG, "displayInterstitial() loaded");
interstitial.show();
}
Log.d(TAG, "end displayInterstitial()");
}
Can anyone please help me to fix this issue?
Simplest way would be:
interstitial.setAdListener(new AdListener() {
#Override
public void onAdClosed() {
finish();
}
});
However, in my opinion it is better to stay at your app for a sec before app finishes. That way it is more clear that this ad was still part of your app:
interstitial.setAdListener(new AdListener() {
#Override
public void onAdClosed() {
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
public void run() {
finish();
}
}, 1000);
}
});
BTW: about the comment of calling MainActivity.super.onBackPressed(); inside the adlistener's onAdClosed: I tested it and threw an IllegalStateException. I guess that is because the moment when onBackPressed is called is too late already. But well it is anyway not needed, so forget about it. The super onBackPressed method itself is accessible from the AdListener though and will compile just fine ;-)
#Override
public void onBackPressed() {
Log.d(TAG, "onBackPressed Called");
displayInterstitial();
//finish();
super.onBackPressed();
}
Related
Currently, I am using the code which is displaying AdMob Interstitial ad after 20 seconds and when the ad is closed I want to show another ad after 60 seconds, this is the code currently I am using for the first ad to load after 20 seconds
new Handler().postDelayed(new Runnable() {
#Override
public void run() {
interAd = new InterstitialAd(MainActivity.this);
interAd.setAdUnitId("ca-app-pub-3940256099942544/1033173712");
AdRequest adRequest = new AdRequest.Builder()
.addTestDevice("SEE_YOUR_LOGCAT_TO_GET_YOUR_DEVICE_ID")
.build();
interAd.loadAd(adRequest);
interAd.setAdListener(new AdListener() {
#Override
public void onAdLoaded() {
interAd.show();
}
});
interAd.setAdListener(new AdListener() {
#Override
public void onAdClosed() {
// Code to be executed when the interstitial ad is closed.
Log.i("Ads", "onAdClosed");
}
});
}
} , 20000);
i have tried this method from AdMob tutorial it load the ads but after every second
interAd.setAdListener(new AdListener() {
#Override
public void onAdClosed() {
// Load the next interstitial.
interAd.loadAd(new AdRequest.Builder().build());
}
});
You should attach you Ad's lifecycle to your Activity's lifecycle so you can start/stop showing adds just when your app is visible to the user.
Create a global variables for you Ad and Handler
private InterstitialAd mInterstitialAd;
private Handler mHandler = new Handler();
private Runnable mRunnable = new Runnable() {
#Override
public void run() {
// Wait 60 seconds
mHandler.postDelayed(this, 60*1000);
// Show Ad
showInterstitial();
}
};
then...
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Create the InterstitialAd and set the adUnitId
mInterstitialAd = newInterstitialAd();
loadInterstitial();
}
#Override
protected void onStart() {
super.onStart();
// Start showing Ad in every 60 seconds
//when activity is visible to the user
mHandler = new Handler();
//mHandler.post(mRunnable);
// Run first add after 20 seconds
mHandler.postDelayed(mRunnable,20*1000);
}
protected void onStop() {
super.onStop();
// Stop showing Ad when activity is not visible anymore
mHandler.removeCallbacks(mRunnable);
}
private void loadInterstitial() {
AdRequest adRequest = new AdRequest.Builder()
.addTestDevice("SEE_YOUR_LOGCAT_TO_GET_YOUR_DEVICE_ID")
.setRequestAgent("android_studio:ad_template").build();
mInterstitialAd.loadAd(adRequest);
}
private InterstitialAd newInterstitialAd() {
InterstitialAd interstitialAd = new InterstitialAd(this);
interstitialAd.setAdUnitId(getString(R.string.interstitial_ad_unit_id));
interstitialAd.setAdListener(new AdListener() {
#Override
public void onAdLoaded() {
mNextLevelButton.setEnabled(true);
}
#Override
public void onAdFailedToLoad(int errorCode) {
mNextLevelButton.setEnabled(true);
}
#Override
public void onAdClosed() {
// Reload ad so it can be ready to be show to the user next time
mInterstitialAd = newInterstitialAd();
loadInterstitial();
}
});
return interstitialAd;
}
private void showInterstitial() {
// Show the ad if it's ready. Otherwise toast and reload the ad.
if (mInterstitialAd != null && mInterstitialAd.isLoaded()) {
mInterstitialAd.show();
} else {
Toast.makeText(this, "Ad did not load", Toast.LENGTH_SHORT).show();
mInterstitialAd = newInterstitialAd();
loadInterstitial();
}
}
Make a new thread, then add a sleep time of 60000 milliseconds before showing your ad back. It will allow for async working.
Example, add this code in the onAdClosed() :
new Thread(new Runnable(){
public void run(){
Thread.sleep(60000);
// Show your ad here
}
}).start();
I'm implementing Admob interstitial ads in a button. But it take 3-4 seconds to load the ads, user wrongly click button again and app get crush. How to preload interstitial ads or load instantly when press the button. Here is my code.
img_ply.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
// TODO Auto-generated method stub
mAdView = (AdView) findViewById(R.id.adView);
mAdView.loadAd(new AdRequest.Builder().build());
mInterstitial.setAdUnitId(getResources().getString(R.string.admob_intertestial_id));
mInterstitial.loadAd(new AdRequest.Builder().build());
mInterstitial.setAdListener(new AdListener() {
#Override
public void onAdLoaded() {
// TODO Auto-generated method stub
super.onAdLoaded();
if (mInterstitial.isLoaded()) {
mInterstitial.show();
mInterstitial.setAdListener(new AdListener() {
#Override
public void onAdClosed() {
super.onAdClosed();
finish();
Intent inttv = new Intent(SingleChannelActivity.this, TvPlay.class);
inttv.putExtra("url", ChannelUrl);
startActivity(inttv);
}
});
}else{
super.onAdLoaded();
}
}
});
}
});
You should put Interstitial load method into onCreate() function of view, not in onClick event of the button !
So, there will be only mInterstitial.show() method in onClick() event.
You must load the inters ads onCreate() and inters ads will be ready whenever you need..
Google changed admob using. Its allowing after splash screen interstial ad.
I write a code. Its working another app but a app. Its not working.
Its my Activity splash. I am using for splash. Firstly opening splash then admob interstial. Its working another app but this app not working.
public class ActivitySplash extends Activity {
InterstitialAd mInterstitialAd;
private static int SPLASH_TIME_OUT = 3000;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
// Prepare the Interstitial Ad
mInterstitialAd = new InterstitialAd(this);
mInterstitialAd.setAdUnitId("ca-app-pub-xxxxxxxx/xxxxx");
mInterstitialAd.setAdListener(new AdListener() {
#Override
public void onAdClosed() {
requestNewInterstitial();
Intent i = new Intent(ActivitySplash.this, MainActivity.class);
startActivity(i);
}
});
requestNewInterstitial();
new Handler().postDelayed(new Runnable() {
/*
* Showing splash screen with a timer. This will be useful when you
* want to show case your app logo / company
*/
#Override
public void run() {
// This method will be executed once the timer is over
// Start your app main activity
// Prepare an Interstitial Ad Listener
Intent i = new Intent(ActivitySplash.this, MainActivity.class);
if (mInterstitialAd.isLoaded()) {
mInterstitialAd.show();
} else {
startActivity(i);
}
// close this activity
finish();
}
}, SPLASH_TIME_OUT);
}
private void requestNewInterstitial() {
AdRequest adRequest = new AdRequest.Builder()
.addTestDevice("C56E5F8DEC56E64E3997ED0856A63292")
.build();
mInterstitialAd.loadAd(adRequest);
}
A SplashActivity is a really poor place to put an interstitial. It is very likely that the interstitial will never be received before your app has loaded.
Adding interstitial add after the splash screen is not recommended as it annoys users. but If you want to display add then:
You have to add additional delay for add to load
when the ad is loaded, you can display it before launching the next activity.
bellow is working code(but this is not a good practice).
InterstitialAd ad;
ad = new InterstitialAd(this);
ad.setAdUnitId(getString(R.string.interstitial));
ad.loadAd(new AdRequest.Builder().build());
ad.setAdListener(new AdListener(){
#Override
public void onAdClosed() {
super.onAdClosed();
startActivity(new Intent(getApplicationContext(), MainActivity.class));
finish();
}
});
new Handler().postDelayed(new Runnable() {
#Override
public void run() {
if(ad.isLoaded()) {
ad.show();
}
else{
startActivity(new Intent(getApplicationContext(), MainActivity.class));
finish();
}
}
}, 4000);
As I have intentionally added the delay of 4 seconds (As a timestamp for the ad to load.).
public class MainActivity extends Activity {
AdView adView;
InterstitialAd interstitialAd;
#Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
adView = (AdView) findViewById(R.id.adView);
interstitialAd = new InterstitialAd(this);
interstitialAd.setAdUnitId("ca-app-pub-3500425325579414/2869090680");
AdRequest adRequest = new AdRequest.Builder().addTestDevice(
"BD9386F17F7DE795B86B5BBBEDDF1095").build();
adView.loadAd(adRequest);
interstitialAd.loadAd(adRequest);
interstitialAd.setAdListener(new AdListener() {
public void onAdLoaded() {
if (interstitialAd.isLoaded()) {
interstitialAd.show();
}
}
});
Thread timerThread = new Thread() {
#Override
public void run() {
// TODO Auto-generated method stub
super.run();
try {
sleep(5000);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
} finally {
?????????????????????
}
}
};
timerThread.start();
}
}
I want to show my Admob add after my selected time.
I want to use a Thread to show my add in dealy.
But how i complite this i could not do it.
Even i tryed this
Thread timerThread = new Thread() {
#Override
public void run() {
// TODO Auto-generated method stub
super.run();
try {
sleep(5000);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
} finally {
interstitialAd.setAdListener(new AdListener() {
public void onAdLoaded() {
if (interstitialAd.isLoaded()) {
interstitialAd.show();
}
}
});
}
}
};
timerThread.start();
But this is not working.
How i can do it in programatically.
The problem I see is that you are setting the Adlistener after a delay instead of showing the ad after a delay.
Also you don't need to create a Thread for doing that, you can try this for example:
interstitialAd.setAdListener(new AdListener() {
public void onAdLoaded() {
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
public void run() {
MainActivity.this.interstitialAd.show();
}
}, 5000);
}
});
Put this in your MainActivity onCreate method and get rid of the timerThread. This way you'll have your interstitial configured that it will show up 5 sec after the ad is loaded.
Note: From user a user experience point of view that is not such a good idea because you'll most likely end up annoying your users. The best practice is to show ads at natural breaks, like "level completed" etc.
You DON'T want to show your interstitial ads at random (delayed or not) time within your app. Unless
You want really bad user ratings
You want Admob to disable your account.
Instead you should pick a suitable break point in your app and show the ad then.
I am using Admob SDK on my app, my I load the add onCreate and onResume, Now when the user press back to exit the app quickly the application display Interstitial ad after few seconds, and the user may close it, So far no problems, but when the user press the app icon from the recent apps; it display blank activity of Admob AdActivity
public void onResume() {
super.onResume();
if (resumeAdFlag) {
AdRequest adRequest = new AdRequest.Builder().build();
interstitial.loadAd(adRequest);
} else {
resumeAdFlag = true;
}
}
and on add loaded
public void onAdLoaded() {
displayInterstitial();
super.onAdLoaded();
}
and this to display
public void displayInterstitial() {
if (interstitial.isLoaded()) {
interstitial.show();
resumeAdFlag = false;
}
}
Is it displaying blank activity after a moment or instantly?
Can you try loading the ad in onResume() and after 5 seconds, calling displayInterstitial() as shown below?
or can you try interstitial with a different ad_unit_id when showing after onResume()?
new CountDownTimer(5000, 5) {
#Override
public void onTick(long millisUntilFinished) {
}
#Override
public void onFinish() {
displayInterstitial();
}
}.start();