Мобильная кроссплатформенная реклама Gluon

Есть ли способ интегрировать рекламу, такую ​​как библиотека Google Admob, в gluon mobile на Android или iOS или, надеюсь, на обоих?

Это файл gradle, я загрузил библиотеку сервисов Google Play и репозиторий Google:

buildscript {
    repositories {
        jcenter()       
    }
    dependencies {
        classpath 'org.javafxports:jfxmobile-plugin:1.2.0'
    }
}

apply plugin: 'org.javafxports.jfxmobile'

repositories {
    jcenter()
    maven {
        url 'http://nexus.gluonhq.com/nexus/content/repositories/releases'
    }
}

mainClassName = 'graphing.calculator.Calculator'

dependencies {
    compile 'com.gluonhq:charm:4.3.0'
    androidCompile 'com.google.android.gms:play-services-ads:9.4.0'
}

jfxmobile {
    downConfig {
        version = '3.2.0'
        plugins 'display', 'lifecycle', 'statusbar', 'storage'
    }
    android {
        manifest = 'src/android/AndroidManifest.xml'
        androidSdk = '/Users/aniket/Library/Android/sdk'
    }
    ios {
        arch = "arm64"
        infoPList = file('src/ios/Default-Info.plist')
        forceLinkClasses = [
                'com.gluonhq.**.*',
                'javax.annotations.**.*',
                'javax.inject.**.*',
                'javax.json.**.*',
                'org.glassfish.json.**.*'
        ]
    }
}

project.afterEvaluate {
    explodeAarDependencies(project.configurations.androidCompile)
}

person Aniket Joshi    schedule 31.03.2017    source источник


Ответы (1)


Да, способ есть как для Android, так и для iOS.

Этот ответ уже содержит фрагмент того, как это можно сделать на Android. Но я обновлю его здесь, используя и расширяя библиотеку Charm Down. Я не буду включать решение iOS, поскольку оно требует изменений в плагине jfxmobile, как я объясню позже.

Создайте новый проект с плагином Gluon и измените следующее. Вам нужно будет сохранить упомянутые мной имена пакетов, но вы можете назвать свой проект (и пакет) по своему усмотрению.

  1. build.gradle скрипт

Вам необходимо включить библиотеку сервисов Google Play:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'org.javafxports:jfxmobile-plugin:1.3.4'
    }
}

apply plugin: 'org.javafxports.jfxmobile'

repositories {
    jcenter()
    maven {
        url 'http://nexus.gluonhq.com/nexus/content/repositories/releases'
    }
}

mainClassName = 'com.gluonhq.adview.GluonAdView' // this can be changed

dependencies {
    compile 'com.gluonhq:charm:4.3.2'

    androidCompile 'com.google.android.gms:play-services-ads:9.4.0'
}

jfxmobile {
    downConfig {
        version '3.2.4'
        plugins 'display', 'lifecycle', 'statusbar', 'storage'
    }
    android {
        manifest = 'src/android/AndroidManifest.xml'
    }
    ios {
        infoPList = file('src/ios/Default-Info.plist')
        forceLinkClasses = [
                'com.gluonhq.**.*',
                'javax.annotations.**.*',
                'javax.inject.**.*',
                'javax.json.**.*',
                'org.glassfish.json.**.*'
        ]
    }
}

project.afterEvaluate {
    explodeAarDependencies(project.configurations.androidCompile)
}

Обратите внимание на последнюю задачу: он взрывает aar файлы в локальных репозиториях android / google, чтобы извлечь файлы jar (в данном случае jar сервисов Google Play и все его зависимости).

Также обратите внимание, что после изменения файла сборки вам необходимо перезагрузить проект (для синхронизации проекта и управления новыми зависимостями).

  1. Исходные пакеты / Java

Помимо файлов проекта, вам необходимо добавить этот пакет: com.gluonhq.charm.down.plugins и эти классы:

AdViewService интерфейс

public interface AdViewService {
    void setAdUnit(String unitId, String testDeviceId, boolean test);
}

AdViewServiceFactory класс

public class AdViewServiceFactory extends DefaultServiceFactory<AdViewService> {

    public AdViewServiceFactory() {
        super(AdViewService.class);
    }

}
  1. Пакеты Android / Java

В пакете Android / Java добавьте этот пакет: com.gluonhq.charm.down.plugins.android и этот класс:

AndroidAdViewService класс

import android.view.Gravity;
import android.widget.LinearLayout;
import com.gluonhq.charm.down.Services;
import com.gluonhq.charm.down.plugins.LifecycleEvent;
import com.gluonhq.charm.down.plugins.LifecycleService;
import com.google.android.gms.ads.AdListener;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdSize;
import com.google.android.gms.ads.AdView;
import javafxports.android.FXActivity;
import com.gluonhq.charm.down.plugins.AdViewService;

public class AndroidAdViewService implements AdViewService {

    private AdView adView;

    @Override
    public void setAdUnit(String unitId, String testDeviceId, boolean test) {
        FXActivity.getInstance().runOnUiThread(() -> {
            LinearLayout layout = new LinearLayout(FXActivity.getInstance());
            layout.setVerticalGravity(Gravity.BOTTOM);
            layout.setOrientation(LinearLayout.VERTICAL);

            adView = new AdView(FXActivity.getInstance());
            adView.setAdSize(AdSize.SMART_BANNER);
            adView.setAdUnitId(unitId);

            AdRequest adRequest;
            if (test) {
                adRequest = new AdRequest.Builder()
                    .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)        // All emulators
                    .addTestDevice(testDeviceId)        // from logcat!
                    .build();
            } else {
                adRequest = new AdRequest.Builder().build();
            }

            adView.loadAd(adRequest);
            adView.setAdListener(new AdListener() {
                @Override
                public void onAdLoaded() {
                    super.onAdLoaded();
                }
            });

            layout.addView(adView);

            FXActivity.getViewGroup().addView(layout);
        });

        Services.get(LifecycleService.class).ifPresent(service -> {
            service.addListener(LifecycleEvent.RESUME, () -> FXActivity.getInstance().runOnUiThread(() -> adView.resume()));
            service.addListener(LifecycleEvent.PAUSE, () -> FXActivity.getInstance().runOnUiThread(() -> adView.pause()));
        });
    }

}

Он использует com.google.android.gms.ads.AdView. Если ваши зависимости Android уже включают сервисы Google Play, у вас не возникнет проблем с импортом. В противном случае вернитесь к шагу 1.

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

  1. AndroidManifest.xml

Вам нужно добавить это в манифест:

<?xml version="1.0" encoding="UTF-8"?>
<manifest ...>
        <uses-permission android:name="android.permission.INTERNET"/>
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
        <application ...>
                <activity .../>
                <meta-data android:name="com.google.android.gms.version" android:value="9452000" />
                <activity android:name="com.google.android.gms.ads.AdActivity" 
                          android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
                          android:theme="@android:style/Theme.Translucent"/>
        </application>
</manifest>

Обратите внимание, что значение Google Play Services соответствует версии 9.4.0.

  1. Образец

Теперь вы можете добавить сервис в свой проект. Для этого вам понадобится идентификатор рекламного блока. Вы можете создать учетную запись в Google AdMob, чтобы добавить свое приложение и получить идентификатор приложения для блока баннера.

AdMob

Чтобы получить идентификатор тестового устройства, вам нужно сначала запустить приложение и найти в консоли идентификатор с adb logcat.

public BasicView(String name) {
    super(name);

    Services.get(AdViewService.class).ifPresent(ads -> {
        ads.setAdUnit("ca-app-pub-17652XXXXXXXXXX/83XXXXXXXX", "0283A9A0758XXXXXXXXXXXXXXXX", true);
    });

    Label label = new Label("Hello JavaFX World!");
    ...
}
  1. Запустите образец на своем устройстве Android

Вы должны увидеть рекламу внизу, а также некоторые журналы на консоли.

04-02 12:42:45.352 25520 25520 I Ads     : Starting ad request.
04-02 12:42:47.844 25520 25520 I Ads     : Scheduling ad refresh 60000 milliseconds from now.
04-02 12:42:47.889 25520 25520 I Ads     : Ad finished loading.

  1. iOS

Для iOS это также возможно. Проблема в том, что для этого требуется загрузить Google Mobile Ads SDK и добавить GoogleMobileAds.framework в список фреймворков, чтобы он находил его при компиляции нативного кода.

Это должно быть сделано в jfxmobile-plugin, поэтому на данный момент это выходит за рамки этого вопроса.

person José Pereda    schedule 02.04.2017
comment
Спасибо! Это фантастика! Значит, реализация iOS для сторонних библиотек, таких как эти, которые используют файлы .framework, не будет использоваться с Gluon, пока плагин не будет обновлен с возможностью добавления их в качестве зависимостей? - person Aniket Joshi; 02.04.2017
comment
На данный момент плагин не позволяет добавлять локальные фреймворки. Я считаю, что его можно изменить, чтобы разрешить добавление фреймворков из локальных путей с некоторым новым предложением, которое можно было бы включить в файл build.gradle. - person José Pereda; 03.04.2017
comment
Следующая ошибка: не удалось найти com.google.android.gms: play-services-ads: 10.2.1. Выполнялся поиск в следующих местах: jcenter.bintray.com/com/google/android/gms/play-services-ads/ jcenter.bintray.com/com/google/android/gms/play- services-ads / появляется каждый раз, когда я пытаюсь создать это - person Aniket Joshi; 03.04.2017
comment
Я также попробовал это с версией 9.4.0, но когда это не сработало, я попытался использовать 10.2.1, самую новую версию, и это тоже не сработало. - person Aniket Joshi; 03.04.2017
comment
Проблема, похоже, связана с файлом gradle, а не с файлом манифеста. Кажется, что файл gradle не может найти расположение зависимостей и загрузить их, поэтому сборка проекта никогда не будет успешной. Я не могу пройти шаг 1 после редактирования файла gradle. - person Aniket Joshi; 03.04.2017
comment
Хорошо, обратите внимание, что сервисы Google Play установлены локально на вашем компьютере, вы не получите их из удаленного репозитория. Для этого плагин jfxmobile ищет локальные репозитории Android и Google. Убедитесь, что вы установили Google Play Services с помощью Android SDK Manager. - person José Pereda; 03.04.2017
comment
Я обновил вопрос с помощью моего файла gradle, но я все еще не могу получить доступ к нужным библиотекам. Stacktrace продолжает говорить Не удалось найти com.google.android.gms: play-services-ads: 9.4.0. Я скачал библиотеки Google Play Services и Google Repository - person Aniket Joshi; 03.04.2017
comment
См. Этот ответ: в нем показаны шаги по установке репозиториев android / google. Также важно, чтобы вы определяли свой путь ANDROID_HOME в файле gradle.properties, а не в файле сборки. - person José Pereda; 03.04.2017
comment
Можно ли получить более подробное руководство о том, как это сделать и на IOS? - person FFdeveloper; 28.06.2017
comment
Хотел бы знать, как это сделать на iOS. - person Warren Nocos; 12.11.2019