Я использую, чтобы добавить простой баннер в свое приложение (игра, написанная с использованием openGL ES 2.0) - обратите внимание, я не использую XML, все делается в коде

Я попытался найти это в Google и посмотреть на SO, но я не могу найти никакой информации - как мы справляемся с фрагментацией экрана при использовании AdMob?

Мое приложение заблокировано в ландшафтном режиме .

Например, я запускаю свое приложение на планшете (с разрешением 2560 x 1600), и все выглядит отлично:

enter image description here

Затем я запускаю его на старом телефоне Galaxy Ace (с разрешением 480 x 320) и получаю следующее:

enter image description here

Очевидно, это неправильно по ряду причин (баннер слишком большой, как правило, слишком близко к элементам управления, простирается до нижней части экрана, когда я действительно хочу, чтобы он распространялся только до нижней части GLViewPort (если это вообще возможно) - в основном, каждый отдельный объект в моей игре масштабируется так, что он будет отображаться с одинаковым относительным размером на каждом экране / DPI, а также с сохранением соотношения, для которого он был предназначен. Я провел очень много времени, чтобы убедиться, что игра выглядит и ощущается одинаково на всех устройствах!

А так баннеры на телефоне совершенно бесполезны. Я застрял в этом? Я могу что-нибудь здесь сделать? Можно ли сделать баннер меньше? Есть ли вообще способ, которым я могу масштабировать это сам? По сути, я думаю, что я спрашиваю, могу ли я реально контролировать эти баннеры?

Я тоже просмотрел официальную документацию Google, и мне это не понравилось. То же самое и с помощью AdMob.

Я новичок в AdMob и весь день пытаюсь придумать, как это сделать, любая помощь будет признательна.

Код:

Код

@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);

}
1
Zippy 16 Апр 2014 в 02:46

4 ответа

Лучший ответ

Размер предоставленного баннера соответствует телефону такого размера и плотности (320 * 50). Вы не можете получить баннер меньшего размера, чем этот. На планшете вы также запрашиваете и показываете баннерную рекламу размером с телефон. Обычно при рендеринге на планшете вы показываете рекламу большего формата (или используете SmartBanner на выбор).

Вам нужно будет подумать о том, как вы можете разделить экран между рекламным баннером и пользовательским интерфейсом вашей игры. Похоже, вы разместили GameUI по центру телефона, и у вас есть место сверху и снизу. Похоже, если вы выровняете пользовательский интерфейс игры по верхнему краю, у вас будет место для рекламного баннера.

Это было бы намного проще, если бы вы разложили все с помощью XML.

1
William 16 Апр 2014 в 05:19

Zippy, вы можете динамически загружать размер рекламы в зависимости от разрешения экрана:

        AdSize adSize = AdSize.SMART_BANNER;

        DisplayMetrics dm = getResources().getDisplayMetrics();

        double density = dm.density * 160;
        double x = Math.pow(dm.widthPixels / density, 2);
        double y = Math.pow(dm.heightPixels / density, 2);
        double screenInches = Math.sqrt(x + y);

        if (screenInches > 8) { // > 728 X 90
            adSize = AdSize.LEADERBOARD;
        } else if (screenInches > 6) { // > 468 X 60
            adSize = AdSize.MEDIUM_RECTANGLE;
        } else { // > 320 X 50
            adSize = AdSize.BANNER;
        }



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

Баннеры других размеров можно найти на официальной странице баннеров.

2
Nana Ghartey 16 Апр 2014 в 00:21

Ах! Я опаздываю на вечеринку. Это то, что я сделал, чтобы решить ту же проблему. Надеюсь, это поможет будущим читателям:

Используйте смарт-баннер, так как он автоматически определяет высоту рекламы в зависимости от размера устройства. Используйте всю ширину экрана для показа рекламы.

С сайта разработчиков Android:

Смарт-баннеры - это рекламные блоки, которые будут отображать рекламные баннеры на весь экран на экране любого размера на разных устройствах в любой ориентации. Смарт-баннеры помогают справиться с увеличивающейся фрагментацией экрана на разных устройствах, «умно» определяя ширину телефона в его текущей ориентации и заставляя рекламу отображать такой размер.

Доступны три высоты рекламы (в dp, пиксели, не зависящие от плотности):

32 - используется, когда высота экрана устройства меньше 400
50 - используется, когда высота экрана устройства составляет от 400 до 720
90 - используется, когда высота экрана устройства больше 720

Теперь получите высоту AdView и отрегулируйте поле макета, где вы хотите разместить баннерную рекламу.

public static int getAdViewHeightInDP(Activity activity) {
        int adHeight = 0;
        
        int screenHeightInDP = getScreenHeightInDP(activity);
        if (screenHeightInDP < 400)
            adHeight = 32;
        else if (screenHeightInDP >= 400 && screenHeightInDP <= 720)
            adHeight = 50;
        else
            adHeight = 90;
        
        return adHeight;
    }

public static int getScreenHeightInDP(Activity activity) {
        DisplayMetrics displayMetrics = ((Context) activity).getResources().getDisplayMetrics();
        
        float screenHeightInDP = displayMetrics.heightPixels / displayMetrics.density;

        return Math.round(screenHeightInDP);
    }
2
Community 20 Июн 2020 в 09:12

Я просто хотел добавить, что вместо этого вы можете использовать нативную рекламу и решать ее самостоятельно, по своим правилам.

Вы делаете это, создавая свой собственный макет и заполняя данные для каждого из добавленных вами представлений.

0
android developer 3 Авг 2020 в 14:53