Gluon 移动跨平台广告查看

标签 gluon javafxports gluon-mobile

有没有办法将广告(例如 Google 的 Admob 库)集成到 Android 或 iOS 或两者上的 gluon mobile 中?

这是 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)
}

最佳答案

是的,有一种方法,适用于 Android 和 iOS。

这个answer已经包含了如何在 Android 上完成此操作的片段。但我将在这里使用和扩展 Charm Down library 来更新它。不过,我不会包含 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)
}

请注意最后一个任务:它会分解 android/google 本地存储库上的 aar 文件,以提取 jar(在本例中为 Google Play Services jar 及其所有依赖项)。

另请注意,修改构建文件后,您需要重新加载项目(以同步项目并管理新的依赖项)。

  • 源代码包/Java
  • 除了项目文件之外,您还需要添加此包:com.gluonhq.charm.down.plugins,以及这些类:

    AdViewService 接口(interface)

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

    AdViewServiceFactory

    public class AdViewServiceFactory extends DefaultServiceFactory<AdViewService> {
    
        public AdViewServiceFactory() {
            super(AdViewService.class);
        }
    
    }
    
  • 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。

    请注意,我正在设置一个布局,其中横幅将位于屏幕底部。在您方便的时候更改此设置。

  • AndroidManifest.xml
  • 您需要将其添加到 list 中:

    <?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 服务值对应于 9.4.0 版本。

  • 示例
  • 现在您可以将该服务添加到您的项目中。为此,您需要一个广告单元 ID。您可以在 Google AdMob 上创建一个帐户来添加您的应用,并获取横幅单元的应用 ID。

    AdMob

    要获取测试设备 ID,您必须先运行应用,然后使用 adb logcat 在控制台中查找 ID。

    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!");
        ...
    }
    
  • 在您的 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.
    

  • iOS
  • 对于 iOS,它是 possible以及。问题在于,它需要下载 Google 移动广告 SDK,并将 GoogleMobileAds.framework 添加到框架列表中,以便在编译 native 代码时找到它。

    这应该在 jfxmobile-plugin 中完成,因此目前超出了这个问题的范围。

    关于Gluon 移动跨平台广告查看,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43132046/

    相关文章:

    java - 从 Gluon Charm Down 读取屏幕方向的空指针

    javafx - Gluon 移动 iOS 音频播放器

    css - 选择了 GluonMobile Css 抽屉导航

    java - 如何将 javaFX 14 应用程序导出为 IntelliJ 中的可执行文件?

    javafx - Gluon JavaFX 16 EA 4 上的 "getNativeWindowHandle+0x54"通过 DRM

    javafx - 带有 JavaFx 11 和 JDK 11 的 Netbeans 9.0

    ios - JavaFXPorts - 移动设备上的滚动条问题

    eclipse - 如何使用构成 Gluon 项目的 iOS、android、桌面(和 main)的 Gluon 文件夹?

    android - 在 Android Studio 上导入 JavaFX 项目

    java - GET 请求失败,JAX-RS : Could not find MessageBodyWriter for response object of type: java. util.ArrayList 媒体类型:text/html