Search code examples
androidadmobopengl-es-2.0scalingbanner-ads

AdMob and different screen Resolution / DPI / Ratio


I am using to add a simple banner to my app (a game written using openGL ES 2.0) - Please note, I am not using any XML, everything is done in code

I've tried to Google this and look around on SO but I can't find any info at all - how do we deal with screen fragmentation when using AdMob?

My App is locked to Landscape mode.

For instance, I run my app on a tablet (with a resolution of 2560 x 1600) and everything looks great:

enter image description here

Then I run it on a old Galaxy Ace phone (with a resolution of 480 x 320) and I get this:

enter image description here

Obviously, this is wrong for a number of reasons (banner too big generally, too close to the controls, extends down to bottom of screen when I really want it only to extend down to the bottom of the GLViewPort (if this is even possible) - basically, every single object in my game is scaled so that it will appear at the same relative size on every screen / DPI as well as retaining the ratio for which it was intended. I've spend a very long time making sure the game looks and feels the same on every device!

As it is, the banners are completely useless on the phone. Am I stuck with this? Is there anything I can do here? Can I make the banner any smaller? Is there any way at all that I can scale it myself? Basically, I guess what I'm asking is do I have any real control over these banners?

I've looked at Google's Official documentation too and I don't find it great. Same goes with AdMob's help.

I'm very new to AdMob and have been trying all day to figure out a way to do this, any help would be appreciated.

Code:

Code

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

        // Create an ad.
        adView = new AdView(this);
        adView.setAdSize(AdSize.BANNER);
        adView.setAdUnitId(AD_UNIT_ID);

        // Add the AdView to the view hierarchy. The view will have no size
        // until the ad is loaded.
        RelativeLayout layout = new RelativeLayout(this);
        layout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,    LayoutParams.MATCH_PARENT));

        // Create an ad request. Check logcat output for the hashed device ID to
        // get test ads on a physical device.
        AdRequest adRequest = new AdRequest.Builder()
          .addTestDevice(TestDeviceID)
          .build();

        // Start loading the ad in the background.
        adView.loadAd(adRequest);

        //Request full screen
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
        WindowManager.LayoutParams.FLAG_FULLSCREEN);

        //Create a displayMetrics object to get pixel width and height
        metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);
        width = metrics.widthPixels;
        height = metrics.heightPixels;

        //Work out values for resizing screen while keeping aspect ratio

        width = (int) Math.min(width, height * 1.702127659574468);
        height = (int) Math.min(height, width / 1.702127659574468);

        //Create and set GL view (OpenGL View)
        myView = new MyGLSurfaceView(MainActivity.this);

        RelativeLayout.LayoutParams adParams = 
                new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, 
                RelativeLayout.LayoutParams.WRAP_CONTENT);
                adParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
                adParams.addRule(RelativeLayout.CENTER_HORIZONTAL);

        //Set the colour if we don't, the ad won't show (bug?)
        adView.setBackgroundColor(Color.BLACK);
        layout.addView(myView);
        layout.addView(adView, adParams);

        //Create a copy of the Bundle
        if (savedInstanceState != null){
            newBundle = new Bundle(savedInstanceState);         
        }


        setContentView(layout);

}

Solution

  • The size of the banner you are being given is correct for that size and density phone (320*50). You can't get a smaller banner than that. On your tablet you are also asking for and displaying a phone sized banner ad. You would normally display a larger format ad (or use SmartBanner to choose for you) when rendering on a tablet.

    You are going to have to think about how you can share the screen between the banner ad and your game UI. It appears that you have centered the GameUI on the phone and have room above and below. It looks like if you aligned the Game UI to the top you would have room for the banner ad.

    This would have been a lot easier if you had laid things out using XML.