Не удается заставить AdMob работать (используя Android, LibGDX)

Я провел много исследований, но мало что из этого имеет смысл, так как я не знаком с размещением рекламы в приложении (это мой первый раз, когда я делаю приложение и впервые работаю с рекламой).

Вот мой обновленный код MainActivity.java:

package com.me.mygdxgame;

import android.os.Bundle;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;

import com.badlogic.gdx.backends.android.AndroidApplication;
import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdSize;
import com.google.android.gms.ads.AdView;

public class MainActivity extends AndroidApplication {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main); //Changed it back to main, got rid of an error

        AndroidApplicationConfiguration cfg = new AndroidApplicationConfiguration();
        cfg.useGL20 = true;

        initialize(new MyGame(), cfg);

        AdView adView;
        adView = new AdView(this);
        adView.setAdSize(AdSize.BANNER);
        adView.setAdUnitId("My Ad Unit ID (just using this string for posting purposes");

        LinearLayout layout = (LinearLayout) findViewById(R.id.normal); //Changed R.id.linearlayout to R.id.normal. After looking at my R.java class, I saw that there was no id.linearlayout, so I changed it to R.id.normal, which did exist.
        layout.addView(adView); //This is line 44, where the NullPointer is caused

        AdRequest adRequest = new AdRequest.Builder().build();

        adView.loadAd(adRequest);
    }
}

Вот обновленный XML-код AndroidManifest:

   <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.me.mygdxgame"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="5" android:targetSdkVersion="17" />
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/testing"
        android:label="@string/app_name" >

        <meta-data android:name="com.google.android.gms.version"
           android:value="@integer/google_play_services_version" />

        <activity
            android:name=".MainActivity"
            android:label="Flappy Nerd"
            android:screenOrientation="portrait"
            android:configChanges="keyboard|keyboardHidden|orientation|screenSize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

         <activity android:name="com.google.android.gms.ads.AdActivity"
             android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>

    </application>

</manifest>

Вот main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/normal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

</LinearLayout>

Вот логарифм:

03-16 16:46:50.126: E/AndroidRuntime(10338): FATAL EXCEPTION: main
03-16 16:46:50.126: E/AndroidRuntime(10338): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.me.mygdxgame/com.me.mygdxgame.MainActivity}: java.lang.NullPointerException
03-16 16:46:50.126: E/AndroidRuntime(10338):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2305)
03-16 16:46:50.126: E/AndroidRuntime(10338):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2359)
03-16 16:46:50.126: E/AndroidRuntime(10338):    at android.app.ActivityThread.access$700(ActivityThread.java:165)
03-16 16:46:50.126: E/AndroidRuntime(10338):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1326)
03-16 16:46:50.126: E/AndroidRuntime(10338):    at android.os.Handler.dispatchMessage(Handler.java:99)
03-16 16:46:50.126: E/AndroidRuntime(10338):    at android.os.Looper.loop(Looper.java:137)
03-16 16:46:50.126: E/AndroidRuntime(10338):    at android.app.ActivityThread.main(ActivityThread.java:5455)
03-16 16:46:50.126: E/AndroidRuntime(10338):    at java.lang.reflect.Method.invokeNative(Native Method)
03-16 16:46:50.126: E/AndroidRuntime(10338):    at java.lang.reflect.Method.invoke(Method.java:525)
03-16 16:46:50.126: E/AndroidRuntime(10338):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187)
03-16 16:46:50.126: E/AndroidRuntime(10338):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
03-16 16:46:50.126: E/AndroidRuntime(10338):    at dalvik.system.NativeStart.main(Native Method)
03-16 16:46:50.126: E/AndroidRuntime(10338): Caused by: java.lang.NullPointerException
03-16 16:46:50.126: E/AndroidRuntime(10338):    at com.me.mygdxgame.MainActivity.onCreate(MainActivity.java:44)
03-16 16:46:50.126: E/AndroidRuntime(10338):    at android.app.Activity.performCreate(Activity.java:5372)
03-16 16:46:50.126: E/AndroidRuntime(10338):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1104)
03-16 16:46:50.126: E/AndroidRuntime(10338):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2267)

Вот обновленный LogCat: когда я убираю строку кода, которая, казалось, вызывала NullPointers «layout.addView (adView);», приложение работает нормально, но я получаю следующие сообщения от LogCat:

03-16 17:04:06.723: E/GooglePlayServicesUtil(11199): The Google Play services resources were not found. Check your project configuration to ensure that the resources are included.

03-16 17:04:09.265: I/Ads(11199): Ad finished loading.

03-16 17:05:09.269: I/Ads(11199): Ad is not visible. Not refreshing ad.

person user3369935    schedule 16.03.2014    source источник
comment
См. руководство по интеграции admob в libgdx.   -  person donfuxx    schedule 16.03.2014


Ответы (4)


Похоже, вы пропустили часть activity для объявлений в вашем файле Manifest:

<activity
   android:name="com.google.android.gms.ads.AdActivity"
   android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" />

Вам придется адаптировать все свои маршруты к этому. Если вы можете скомпилировать, но это не работает, вы, вероятно, используете устаревшую версию AdMob. Вам нужно будет импортировать google-play_lib внешнюю библиотеку в свой проект, вот ссылка о том, как это сделать.

person nKn    schedule 16.03.2014
comment
Спасибо. Я добавил google-play_lib и добавил часть активности в свой файл манифеста, но теперь получаю новые ошибки. Не могли бы вы взглянуть на мой обновленный код (в моих правках), чтобы узнать, сможете ли вы его найти? - person user3369935; 16.03.2014
comment
И в чем ошибка? Опубликуйте полную трассировку стека. Кстати, то, что вы выложили, это всего лишь создание объекта AdView, но вы его нигде не размещаете, поэтому сейчас он не будет показан. Вам нужно добавить его к LinearLayout, например. - person nKn; 16.03.2014
comment
Это происходит потому, что вы включаете одну и ту же библиотеку 2 раза. По сути, на каком-то этапе вы дважды включили библиотеку google-play_lib. Просто удалите один из них, и ошибка должна исчезнуть. - person nKn; 16.03.2014
comment
В моем проекте Android у меня есть google-play-services.jar в моих частных библиотеках Android, google-play-services_lib.jar в моих зависимостях Android и GoogleAdMobAdsSdk-6.4.1.jar в моих библиотеках, на которые ссылаются. Тем не менее, я не могу удалить ни один из них. Любая помощь? - person user3369935; 16.03.2014
comment
Вы просто щелкните правой кнопкой мыши на банках и нажмите «Удалить». Я рекомендую загрузить библиотеку google-play_lib и вручную импортировать ее в свой проект, скопировав ее в каталог проекта, а затем выбрав Файл -> Импорт... - person nKn; 16.03.2014
comment
Я уже импортировал google-play_lib в свой проводник пакетов. Это то, что вы имеете в виду, импортируя его в мой проект? И я щелкаю правой кнопкой мыши по банкам, и опция удаления неактивна и недоступна... - person user3369935; 16.03.2014
comment
Да, именно это я и имею в виду. Проблема в двух других экземплярах той же библиотеки, интересно, почему вы не можете удалить. Вы можете просто удалить их вручную, перейдя в папку вашего проекта, а затем перейдите в Eclipse, щелкните правой кнопкой мыши свой проект и нажмите Обновить (F5) - person nKn; 17.03.2014
comment
Хорошо, я нахожусь в своем Workspace\MyProjectName-android\bin\dexedLibs... Удалить GoogleAdMobAdsSdk-6.4.1.jar, google-play-services_lib.jar или google-play-services.jar? - person user3369935; 17.03.2014
comment
Огромное спасибо. Теперь я могу запустить его, но он сразу же вылетает. Я обновил вопрос и добавил logcat. Вот где вызывается NullPointer, согласно logcat: layout.addView(adView); - person user3369935; 17.03.2014
comment
Есть ли в вашем макете R.layout.main элемент LinearLayout под названием R.id.normal? - person nKn; 17.03.2014
comment
Ну, я отвечаю себе, что нет :-) Вот почему вы получаете NullPointerException. Назовите LinearLayout внутри вашего основного макета, и он должен работать. - person nKn; 17.03.2014
comment
Нет, но в общедоступном статическом конечном идентификаторе класса R.java есть public static final int normal, и у меня есть LinearLayout в main.xml... Я отредактировал вопрос, в частности, LogCat. - person user3369935; 17.03.2014
comment
Я думаю, вы неправильно понимаете, как работают макеты. Когда вы звоните findViewById(), вы пытаетесь найти идентификатор, указанный исключительно в вашем файле layout. Это означает, что Android попытается найти View с именем R.id.normal в вашем файле main.xml (поскольку вы установили содержимое как setContentView(R.layout.main);). Если он не найдет его, он выдаст NullPointerException, что вы и видите. Вам нужно назвать свой LinearLayout normal, задав ему идентификатор с атрибутом id: android:id="@+id/normal". - person nKn; 17.03.2014
comment
Хм, это странно, потому что, когда я удалил layout.addView(adView);, программа работала нормально, что заставило меня поверить, что это adView было нулевым, а не layout. Кроме того, строка LinearLayout layout = (LinearLayout)findViewById(R.id.normal); не вызвала у меня никаких проблем... поэтому, если я добавлю строку android:id="@+id/normal" в мой main.xml, она должна работать нормально? - person user3369935; 17.03.2014
comment
Просто попробуйте, должно сработать. Как только вы заработаете, как для репутации, так и для отзывов, вы должны принять ответ из числа тех, которые помогли вам больше всего, это поможет другим пользователям узнать, какой ответ был наиболее продуктивным для вас, и поможет им лучше. - person nKn; 17.03.2014
comment
Я добавил строку android:id="@+id/normal" в main.xml, а программа по-прежнему выдает мне NullPointer, что заставляет меня думать, что это связано с моим adview. Я думаю, что это связано с ошибками в LogCat, говорящими The Google Play services resources were not found. Check your project configuration to ensure that the resources are included. Я попытался удалить google-play-services_libs из своего рабочего пространства, удалить ссылки, а затем импортировать его и снова сослаться на него, но это не сработало. Возможно, мне не хватает SDK? Разве я не должен был удалить GoogleAdMobAdsSdk-6.4.1.jar? - person user3369935; 17.03.2014
comment
Должен ли я добавить свой класс R.java в вопрос? Обновление моего main.xml, похоже, ничего не дает, мой layout по-прежнему равен нулю (я тестировал с помощью System.out.println), тогда как мои adView и adRequest работают нормально... - person user3369935; 17.03.2014

Ваш код такой беспорядок!

В нем есть несколько ошибок, которые вы должны исправить. Во избежание ошибок ваша setContentView(R.layout.main); должна быть первой строкой сразу после super.onCreate(savedInstanceState);

И самое непонятное, на мой взгляд, это:

Почему вы объявили RelativeLayout внутри приложения Manifest?? Он должен быть объявлен внутри main.xml. Это причина вашего NullPointerException. Это происходит потому, что R.id.mainLayout ничего не может найти с этим идентификатором внутри вашего макета, таким образом делая layout переменной null и при вызове вызывает сбой (потому что он неправильно объявлен в вашем манифесте).

person yugidroid    schedule 16.03.2014
comment
Да, мой код действительно беспорядочный, я понятия не имею, как работать с XML или рекламой. Все это время я работал над основным проектом, а не над проектом Android, поэтому я нахожусь на незнакомой территории. Похоже, что в моем проекте Android нет файла main.xml. Где я должен объявить свой RelativeLayout? И не могли бы вы показать мне, как я должен это сделать?? - person user3369935; 16.03.2014
comment
Вы должны объявить свой RelativeLayout внутри layout > main.xml (он может быть там, иначе вы никогда не сможете ссылаться на него с помощью R.layout.main при установке содержимого в представление действия). - person yugidroid; 16.03.2014
comment
Я не думаю, что мне больше нужен RelativeLayout, потому что я посмотрел учебник и использовал часть кода оттуда. Я внес некоторые изменения в свой исходный пост, в основном в файле MainActivity.java. Я разместил новую версию моего MainActivity.java под своим исходным сообщением. Тем не менее, я все еще получаю ошибки. Знаешь, как бы я их починил? - person user3369935; 16.03.2014

Как @yugidroid, ваш код довольно беспорядочный! :P Но в конце концов ты его получишь, не волнуйся!

Самое главное, не ставьте макеты в свой манифест, они туда не идут! В вашей папке /layout (внутри вашего проекта) создайте новый xml-файл с именем «activity_main.xml» и заполните его следующим образом:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
<LinearLayout
    android:id="@+id/linearLayout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal"></LinearLayout>
</RelativeLayout>

В вашем java-файле измените на

adView.setAdUnitId("xx-xxx-xxx-1234567890123456/1234567890"); //Change the numbers to what google sent you in the email!!!

и Adrequest изменить на

AdRequest adRequest = new AdRequest.Builder().build();

(не рекомендуется для тестирования, но пока сойдет)

Тем не менее, я рекомендую вам еще раз прочитать документацию, она довольно проста https://developers.google.com/mobile-ads-sdk/docs/#play https://developers.google.com/mobile-ads-sdk/docs/admob/fundamentals#play

person Alqueraf    schedule 16.03.2014
comment
Я щелкнул по обеим ссылкам и следовал инструкциям. XML выглядит нормально, но я все еще получаю ошибки в коде Java. Можете ли вы проверить мои правки, чтобы увидеть, сможете ли вы выяснить проблему? - person user3369935; 16.03.2014
comment
Спасибо за помощь. Я не делал того, что вы сказали в своем ответе; Я обновил свой вопрос с комментариями, показывающими, где я внес изменения. Теперь я получаю новые ошибки... (это меня так сбивает с толку) - person user3369935; 16.03.2014

Бьюсь об заклад, вы получаете NullPointerException на

findViewById(R.id.normal)

Почти наверняка это связано с вызовом метода #initialize #setContentView и заменой R.layout.main чем-то другим.

person William    schedule 17.03.2014