I am using andengine and I am switching between two scenes. My intention is to put an interstitial ad between the transition. This is my code so far:
public void showGameOver(){
mainactivity=new MainActivity();
mainactivity.runOnUiThread(new Runnable(){
#Override
public void run() {
// TODO Auto-generated method stub
interstitial = new InterstitialAd(mainactivity);
interstitial.setAdUnitId("MY AD UNIT ID");
AdRequest adRequest = new AdRequest.Builder().build();
interstitial.loadAd(adRequest);
if (interstitial.isLoaded()) {
interstitial.show();
}
}
});
interstitial.setAdListener(new AdListener() {
#Override
public void onAdLoaded() {
}
#Override
public void onAdClosed() {
// Proceed to the next level.
setCurrentScene(gameover);
res.engine.setScene(gameover);
gameover.loadResources();
gameover.create();
}
});
}
The above code( without the interstitial ad code) switches to my gameover scene. When I put the interstitial ad code, my app crashes. The interstitial ad is supposed to show the ad, and when it closes, my gameover scene should show. I put in the correct ad unit id.
Logcat says: cannot create handler inside thread that has not called looper.prepare().
I searched this up and solutions state that I must put it on the runonuithread method, which I did.
Any help will be appreciated.
You can't instantiate a new activity via mainactivity=new MainActivity(); and use that. Instead you should pass the game's underlying activity to your gameOver() method and use that:
public void showGameOver(Activity yourActivity){
yourActivity.runOnUiThread(new Runnable(){
#Override
public void run() {
// TODO Auto-generated method stub
interstitial = new InterstitialAd(mainactivity);
interstitial.setAdUnitId("MY AD UNIT ID");
AdRequest adRequest = new AdRequest.Builder().build();
interstitial.loadAd(adRequest);
if (interstitial.isLoaded()) {
interstitial.show();
}
}
});
Related
I have 3 activity A, B, and C and I am showing interstitial ad in activity B. But problem is if I instantly back in activity A, interstitial appear in activity A. If I instantly go next activity C, interstitial appear in activity C. But I want interstitial will show only in activity B. Google haven't accept my app update for this reason.
try this way
InterstitialAd mInterstitial = new InterstitialAd(this);
mInterstitial.setAdUnitId(getResources().getString(Your_init_id));
AdRequest adRequest = new AdRequest.Builder().build();
mInterstitial.setAdListener(new AdListener() {
#Override
public void onAdLoaded() {
Log.d("==","onAdLoaded");
mInterstitial.show();
}
#Override
public void onAdFailedToLoad(int errorCode) {
// Code to be executed when an ad request fails.
Log.d("==","onAdFailedToLoad"+errorCode);
moveToOtherActivity();
}
#Override
public void onAdOpened() {
// Code to be executed when the ad is displayed.
}
#Override
public void onAdLeftApplication() {
// Code to be executed when the user has left the app.
}
#Override
public void onAdClosed() {
// Code to be executed when when the interstitial ad is closed.
Log.d("==","onAdClosed");
moveToOtherActivity();
}
});
mInterstitial.loadAd(adRequest);
}
private void moveToOtherActivity() {
Intent intent;
intent = new Intent(this,Activity_which_you_want_to_display_after_interstitial .class);
startActivity(intent);
finish();
}
There is a way to hide an interstitial discussed in this post
This doesn't prevent it from appearing, it just closes it.
Hope it helps
I'm using the basic example to add ads interstitial ads in my app with admob and firebase:
public class MainActivity extends ActionBarActivity {
InterstitialAd mInterstitialAd;
Button mNewGameButton;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mNewGameButton = (Button) findViewById(R.id.newgame_button);
mInterstitialAd = new InterstitialAd(this);
mInterstitialAd.setAdUnitId("ca-app-pub-3940256099942544/1033173712");
mInterstitialAd.setAdListener(new AdListener() {
#Override
public void onAdClosed() {
requestNewInterstitial();
beginPlayingGame();
}
});
requestNewInterstitial();
mNewGameButton.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
if (mInterstitialAd.isLoaded()) {
mInterstitialAd.show();
} else {
beginPlayingGame();
}
}
});
beginPlayingGame();
}
private void requestNewInterstitial() {
AdRequest adRequest = new AdRequest.Builder()
.addTestDevice("SEE_YOUR_LOGCAT_TO_GET_YOUR_DEVICE_ID")
.build();
mInterstitialAd.loadAd(adRequest);
}
private void beginPlayingGame() {
// Play for a while, then display the New Game Button
}
}
Now, I have two activities (A and B) . I want when Activity A is open, load the ads, and when Activity B is open, show the same ads loaded in A, Please help me and sorry for my bad English! I ask in this language because the English community is more effective
It seems ok for me. The ad is displayed after buttton click, if its loaded. So in case you start B activity in beginPlayingGame all will be ok. Fact that ad is started from A activity not B is detail.
Did you want somethink else?
Of course, it is possible.
You have to store interstitial instance somewhere outside the Activity class (e.g. in Application class static variable) and implement listener outside this Activity.
That's it!
I am trying to add interstitial ads to my game. It is built on a framework from a book. The constructor is:
public GameScreen(Game game) {
super(game);
world = new World();
clueLetters = new String[10];
levelNo = SettingsObject.levelUnlock;
getWord();
interstitialAd = new InterstitialAd(AndroidGame.context);
interstitialAd.setAdUnitId("ca-app-pub-1861496496821617/");
//Create an ad request
AdRequest.Builder adRequestBuilder = new AdRequest.Builder();
AndroidGame.activityReference.runOnUiThread(new Runnable() {
#Override
public void run()
{
// Set AdListener
interstitialAd.setAdListener(new AdListener() {
#Override
public void onAdClosed() {
super.onAdClosed();
}
});
}
});
Looper.prepare();
interstitialAd.loadAd(adRequestBuilder.build());
}
However, I get the error:
java.lang.IllegalStateException: setAdListener must be called on the main UI thread.
Can you tell me why I am getting that error and how to fix it, please?
I use the a similar/same framework. The best way is to set up the interstitial ads in the AndroidGame activity class and use an interface to show the ads in your game screen:
First create the interface class:
public interface MyActivityListener {
public void showInterstitial();
}
Then in your AndroidGame class, implement the interface:
public abstract class AndroidGame extends Activity implements Game, MyActivityListener {
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
interstitialAd = new InterstitialAd(AndroidGame.context);
interstitialAd.setAdUnitId("ca-app-pub-1861496496821617/");
//Create an ad request
AdRequest.Builder adRequestBuilder = new AdRequest.Builder();
interstitialAd.loadAd(adRequestBuilder.build());
// Set AdListener
interstitialAd.setAdListener(new AdListener() {
#Override
public void onAdClosed() {
super.onAdClosed();
}
});
}
#Override
public void showInterstitial() {
runOnUiThread(new Runnable() {
#Override
public void run() {
if(interstitialAd != null && interstitialAd.isLoaded())
interstitialAd.show();
}
});
}
}
With this, any time you want to show ads in any screen, you just get call the showInterstitial() method. Example in your game screen:
public class GameScreen extends Screen{
MYActivityListener mL;
public GameScreen(Game game) {
super(game);
mL = (MyActivityListener)game;
world = new World();
clueLetters = new String[10];
levelNo = SettingsObject.levelUnlock;
getWord();
mL.showInterstitial();
}
}
I use this implementation to do all work that requires running on the UI thread (hide and show banner ads, rate/share app, storing scores etc. Hope it helps :)
I tried to add the code as per Google ADMOB Ads but it didn't work. Then I started working with GITHUB example to add Interstitial ads. I have no errors whatsoever in my project. Eclipse shows nothing in place of ads. Please have a look at my code and tell me where am I going wrong. I will highlight stuff wherever necessary. BANNER ADS ARE WORKING!!!!
public class AppGame extends Activity {
AdView adView;
/** The log tag. */
private static final String LOG_TAG = "InterstitialSample";
/** Your ad unit id. Replace with your actual ad unit id. */
private static final String AD_UNIT_ID1 = "INSERT AD ID HERE";
/** The interstitial ad. */
private InterstitialAd interstitialAd;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
interstitialAd = new InterstitialAd(this);
interstitialAd.setAdUnitId(AD_UNIT_ID1);
// Set the AdListener.
interstitialAd.setAdListener(new AdListener() {
#Override
public void onAdLoaded() {
Log.d(LOG_TAG, "onAdLoaded");
}
#Override
public void onAdFailedToLoad(int errorCode) {
// Change the button text and disable the button.
}
});
}
/** Called when the Load Interstitial button is clicked. */
public void loadInterstitial(View unusedView) {
// Disable the show button until the new ad is loaded.
// Check the logcat output for your hashed device ID to get test ads on a physical device.
AdRequest adRequest = new AdRequest.Builder()
.addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
.addTestDevice("INSERT_YOUR_HASHED_DEVICE_ID_HERE")
.build();
// Load the interstitial ad.
interstitialAd.loadAd(adRequest);
}
/** Called when the Show Interstitial button is clicked. */
public void showInterstitial(View unusedView) {
// Disable the show button until another interstitial is loaded.
if (interstitialAd.isLoaded()) {
interstitialAd.show();
} else {
Log.d(LOG_TAG, "Interstitial ad was not ready to be shown.");
}
}
/** Gets a string error reason from an error code. */
private String getErrorReason(int errorCode) {
String errorReason = "";
switch(errorCode) {
case AdRequest.ERROR_CODE_INTERNAL_ERROR:
errorReason = "Internal error";
break;
case AdRequest.ERROR_CODE_INVALID_REQUEST:
errorReason = "Invalid request";
break;
case AdRequest.ERROR_CODE_NETWORK_ERROR:
errorReason = "Network Error";
break;
case AdRequest.ERROR_CODE_NO_FILL:
errorReason = "No fill";
break;
}
return errorReason;
}
}
Call loadInterstitial(v) after setting setting the adunit:
interstitialAd.setAdUnitId(AD_UNIT_ID1);
loadInterstitial(v);
And call showInterstitial(v) when/where you want to show the ad:
You forgot to call the loadInterstitial function for the interstitial ad to load.
In your onCreate function, call the loadInterstitial function. Then add the listener to it like so:
interstitialAd.setAdListener(new AdListener() {
#Override
public void onAdLoaded() {
Log.d(LOG_TAG, "onAdLoaded");
interstitialAd.show();
}
or set a boolean to true and at a natural breakpoint in your app, check if the boolean is true and then show the ad.
I have the same problem in my one of the testing device. I searched so many days. But i didn't get any solution.
At last I tried by removing the code
.addTestDevice("INSERT_YOUR_HASHED_DEVICE_ID_HERE")
and I got successful result.
So try like this at last step of testing.
onCreate add below lines
mInterstitialAd = new InterstitialAd(this);
// set the ad unit ID
mInterstitialAd.setAdUnitId(getString(R.string.interstitial_full_screen));
mInterstitialAd.setAdListener(new AdListener() {
#Override
public void onAdClosed() {
}
#Override
public void onAdLoaded() {
// Ads loaded, stop requesting
mInterstitialAd.show();
//update time start
timeStart = new Date().getTime();
}
});
onResume check time show Intertitial Ads and send request Ads:
if(new Date().getTime()-timeStart>=timeShowAds) {
AdRequest adRequest = new AdRequest.Builder()
.addTestDevice("36E0B62FE34536712ED1BEBD85467085")
.build();
// Load ads into Interstitial Ads
mInterstitialAd.loadAd(adRequest);
}
I new in AdMob. At first I'm trying to create a test app with different types of ad.
I use real ad_unit_id and nexus 4 for testing.
I use 1 layout xml for all activity:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads"
android:id="#+id/empty_layout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
</LinearLayout>
When i create simple activity with banner ad it's work fine. Activity code:
public class AdBannerActivity extends Activity {
private AdView adView;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ad_empty);
adView = new AdView(this, AdSize.SMART_BANNER, getString(R.string.adUnitId));
adView.setAdListener(this);
LinearLayout layout = (LinearLayout) findViewById(R.id.empty_layout);
layout.addView(adView);
adView.loadAd(new AdRequest());
}
#Override
public void onDestroy() {
if (adView != null) {
adView.destroy();
}
super.onDestroy();
}
}
When i try to create activity with full screen ad, i have error message:
Ad request successful, but no ad returned due to lack of ad inventory.
Activity code:
public class AdInterstitialActivity extends Activity implements AdListener {
private InterstitialAd interstitial;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ad_empty);
interstitial = new InterstitialAd(this, getString(R.string.adUnitId));
interstitial.setAdListener(this);
AdRequest adRequest = new AdRequest();
interstitial.loadAd(adRequest);
}
#Override
public void onReceiveAd(Ad ad) {
if (ad == interstitial) {
interstitial.show();
}
}
#Override
public void onDismissScreen(Ad ad) {
}
#Override
public void onFailedToReceiveAd(Ad ad, ErrorCode error) {
Log.e("AdTest", "Error code: " + error);
}
#Override
public void onLeaveApplication(Ad ad) {
}
#Override
public void onPresentScreen(Ad ad) {
}
}
What am I doing wrong?
How to solve this problem?
Solution: Create new ad_unit_id for interstitial ads in AdMob account.
If your have that error, then your code is correct. Admob just doesn't have any ads to display for your app (your country, your type of ads are determinants).
If you want to test the behavior of your ads in test mode, you should take a look at this link :
https://developers.google.com/mobile-ads-sdk/docs/admob/additional-controls#testmode
EDIT : If you have just created your Admob account, it may take some times and some requests to deliver the first ads.
I saw somewhere that people had this error too by using custom size for banner, so be sure to check :
https://developers.google.com/mobile-ads-sdk/docs/admob/intermediate#play