Gluon 移动跨平台广告查看
Gluon mobile cross-platform adsView
是否有任何方法可以将 Google 的 Admob 库等广告集成到 android 或 iOS 或两者上的 gluon Mobile 中?
这是 gradle 文件,我已经下载了 Google 播放服务库和 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 都有办法。
这个 already contains a snippet of how it could be done on Android. But I'll update it here using and extending the Charm Down library。不过,我不会包含 iOS 解决方案,因为它需要修改 jfxmobile 插件,我稍后会解释。
新建一个带有Gluon插件的项目,修改以下内容。您必须保留我提到的包名称,但您可以根据需要命名您的项目(和包)。
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 及其所有依赖项).
另请注意,修改构建文件后,您需要重新加载项目(以同步项目并管理新的依赖项)。
- 来源Packages/Java
除了项目文件,你还需要添加这个包:com.gluonhq.charm.down.plugins
,这些class是:
AdViewService
界面
public interface AdViewService {
void setAdUnit(String unitId, String testDeviceId, boolean test);
}
AdViewServiceFactory
class
public class AdViewServiceFactory extends DefaultServiceFactory<AdViewService> {
public AdViewServiceFactory() {
super(AdViewService.class);
}
}
- Android/Java 包
在 Android/Java 包中,添加此包:com.gluonhq.charm.down.plugins.android
,以及此 class:
AndroidAdViewService
class
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
您需要将此添加到清单中:
<?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 版本。
- 样本
现在您可以将服务添加到您的项目中。为此,您需要一个广告单元 ID。您可以在 Google AdMob 上创建一个帐户以添加您的应用程序,并获取横幅广告单元的应用程序 ID。
要获取测试设备 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
添加到框架列表中,因此在编译本机代码时它会找到它。
这应该在 jfxmobile-plugin
中完成,所以现在不在这个问题的范围内。
是否有任何方法可以将 Google 的 Admob 库等广告集成到 android 或 iOS 或两者上的 gluon Mobile 中?
这是 gradle 文件,我已经下载了 Google 播放服务库和 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 都有办法。
这个
新建一个带有Gluon插件的项目,修改以下内容。您必须保留我提到的包名称,但您可以根据需要命名您的项目(和包)。
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 及其所有依赖项).
另请注意,修改构建文件后,您需要重新加载项目(以同步项目并管理新的依赖项)。
- 来源Packages/Java
除了项目文件,你还需要添加这个包:com.gluonhq.charm.down.plugins
,这些class是:
AdViewService
界面
public interface AdViewService {
void setAdUnit(String unitId, String testDeviceId, boolean test);
}
AdViewServiceFactory
class
public class AdViewServiceFactory extends DefaultServiceFactory<AdViewService> {
public AdViewServiceFactory() {
super(AdViewService.class);
}
}
- Android/Java 包
在 Android/Java 包中,添加此包:com.gluonhq.charm.down.plugins.android
,以及此 class:
AndroidAdViewService
class
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
您需要将此添加到清单中:
<?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 版本。
- 样本
现在您可以将服务添加到您的项目中。为此,您需要一个广告单元 ID。您可以在 Google AdMob 上创建一个帐户以添加您的应用程序,并获取横幅广告单元的应用程序 ID。
要获取测试设备 ID,您必须先 运行 应用程序,然后在控制台中使用 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!");
...
}
- 运行 您 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
添加到框架列表中,因此在编译本机代码时它会找到它。
这应该在 jfxmobile-plugin
中完成,所以现在不在这个问题的范围内。