有没有办法将广告(例如 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插件创建一个新项目,并修改以下内容。您必须保留我提到的包名称,但您可以根据需要命名您的项目(和包)。
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。
要获取测试设备 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/