如何在GluonFX移动插件中使用Android原生类及集成AdMob SDK?
解决GluonFX集成Android原生类与AdMob的问题
我是GluonFX新手,已按官方文档通过Maven创建项目并成功编译,现在想实现两个需求:
- 使用Android SDK中的
android.os.Vibrator、Toast等原生类 - 在JavaFX应用中集成AdMob SDK实现广告功能
当前项目的pom.xml配置如下:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.gluonapplication</groupId> <artifactId>gluonapplication</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>GluonApplication</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.release>11</maven.compiler.release> <javafx.version>21</javafx.version> <attach.version>4.0.19</attach.version> <gluonfx.plugin.version>1.0.24</gluonfx.plugin.version> <javafx.plugin.version>0.0.8</javafx.plugin.version> <mainClassName>com.gluonapplication.GluonApplication</mainClassName> </properties> <dependencies> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-controls</artifactId> <version>${javafx.version}</version> </dependency> <dependency> <groupId>com.gluonhq</groupId> <artifactId>charm-glisten</artifactId> <version>6.2.3</version> </dependency> <dependency> <groupId>com.gluonhq.attach</groupId> <artifactId>display</artifactId> <version>${attach.version}</version> </dependency> <dependency> <groupId>com.gluonhq.attach</groupId> <artifactId>lifecycle</artifactId> <version>${attach.version}</version> </dependency> <dependency> <groupId>com.gluonhq.attach</groupId> <artifactId>statusbar</artifactId> <version>${attach.version}</version> </dependency> <dependency> <groupId>com.gluonhq.attach</groupId> <artifactId>storage</artifactId> <version>${attach.version}</version> </dependency> <dependency> <groupId>com.gluonhq.attach</groupId> <artifactId>util</artifactId> <version>${attach.version}</version> </dependency> </dependencies> <repositories> <repository> <id>Gluon</id> <url>https://nexus.gluonhq.com/nexus/content/repositories/releases</url> </repository> </repositories> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> </plugin> <plugin> <groupId>org.openjfx</groupId> <artifactId>javafx-maven-plugin</artifactId> <version>${javafx.plugin.version}</version> <configuration> <mainClass>${mainClassName}</mainClass> </configuration> <executions> <execution> <!-- Default configuration for running --> <!-- Usage: mvn clean javafx:run --> <id>default-cli</id> </execution> <execution> <!-- Configuration for manual attach debugging --> <!-- Usage: mvn clean javafx:run@debug --> <id>debug</id> <configuration> <options> <option>-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=localhost:8000</option> </options> </configuration> </execution> <execution> <!-- Configuration for automatic IDE debugging --> <id>ide-debug</id> <configuration> <options> <option>-agentlib:jdwp=transport=dt_socket,server=n,address=${jpda.address}</option> </options> </configuration> </execution> <execution> <!-- Configuration for automatic IDE profiling --> <id>ide-profile</id> <configuration> <options> <option>${profiler.jvmargs.arg1}</option> <option>${profiler.jvmargs.arg2}</option> <option>${profiler.jvmargs.arg3}</option> <option>${profiler.jvmargs.arg4}</option> <option>${profiler.jvmargs.arg5}</option> </options> </configuration> </execution> </executions> </plugin> <plugin> <groupId>com.gluonhq</groupId> <artifactId>gluonfx-maven-plugin</artifactId> <version>${gluonfx.plugin.version}</version> <configuration> <target>${gluonfx.target}</target> <attachList> <list>display</list> <list>lifecycle</list> <list>statusbar</list> <list>storage</list> </attachList> <mainClass>${mainClassName}</mainClass> </configuration> </plugin> </plugins> </build> <profiles> <profile> <id>ios</id> <properties> <gluonfx.target>ios</gluonfx.target> </properties> </profile> <profile> <id>android</id> <properties> <gluonfx.target>android</gluonfx.target> </properties> </profile> </profiles> </project>
一、集成Android原生类(Toast、Vibrator)
1. 更新pom.xml配置
添加依赖
在<dependencies>节点中加入以下依赖,Gluon Attach提供了封装好的API,无需直接操作Android原生类:
<!-- 震动功能 --> <dependency> <groupId>com.gluonhq.attach</groupId> <artifactId>vibration</artifactId> <version>${attach.version}</version> </dependency> <!-- 通知(替代Toast) --> <dependency> <groupId>com.gluonhq.attach</groupId> <artifactId>notification</artifactId> <version>${attach.version}</version> </dependency>
更新Attach模块列表
在gluonfx-maven-plugin的<attachList>中添加对应的模块:
<attachList> <list>display</list> <list>lifecycle</list> <list>statusbar</list> <list>storage</list> <list>vibration</list> <list>notification</list> </attachList>
2. 代码实现
使用震动功能
import com.gluonhq.attach.vibration.VibrationService; import com.gluonhq.attach.util.Services; // 触发1秒震动 Services.get(VibrationService.class).ifPresent(service -> { service.vibrate(1000); });
使用Toast风格通知
import com.gluonhq.attach.notification.NotificationService; import com.gluonhq.attach.notification.Notification; // 显示Toast样式通知 Services.get(NotificationService.class).ifPresent(service -> { service.notify("提示", "这是一条通知消息"); });
直接调用Android原生API(可选)
如果一定要用原生Toast和Vibrator,需先添加权限:
在src/main/resources/META-INF/gluonfx/android/AndroidManifest.xml中添加:
<uses-permission android:name="android.permission.VIBRATE"/>
然后编写代码:
import javafx.application.Platform; import android.os.Vibrator; import android.widget.Toast; import android.content.Context; import com.gluonhq.attach.lifecycle.LifecycleService; // 判断当前平台为Android时执行 if (Platform.isAndroid()) { // 获取Android上下文 Context context = (Context) LifecycleService.getInstance().getPlatform().get("activity"); // 显示原生Toast Toast.makeText(context, "原生Toast提示", Toast.LENGTH_SHORT).show(); // 触发震动 Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); if (vibrator != null) { vibrator.vibrate(1000); } }
二、集成AdMob SDK
1. 更新pom.xml配置
添加AdMob依赖
在<dependencies>中加入:
<dependency> <groupId>com.gluonhq</groupId> <artifactId>admob</artifactId> <version>6.2.3</version> <!-- 与charm-glisten版本保持一致 --> </dependency>
配置Android权限与AdMob元数据
在gluonfx-maven-plugin的<configuration>中添加:
<androidManifestAdditions> <![CDATA[ <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <application> <!-- 替换为你的AdMob App ID --> <meta-data android:name="com.google.android.gms.ads.APPLICATION_ID" android:value="ca-app-pub-xxxxxxxxxxxxxxxx~yyyyyyyyyy"/> </application> ]]> </androidManifestAdditions>
2. 代码实现Banner广告
import com.gluonhq.charm.glisten.application.MobileApplication; import com.gluonhq.charm.glisten.view.View; import com.gluonhq.attach.lifecycle.LifecycleService; import javafx.application.Platform; import javafx.scene.Scene; import javafx.scene.layout.StackPane; import android.content.Context; import com.google.android.gms.ads.AdRequest; import com.google.android.gms.ads.AdSize; import com.google.android.gms.ads.AdView; import javafx.embed.swing.SwingNode; public class GluonApplication extends MobileApplication { @Override public void init() { addViewFactory(HOME_VIEW, () -> { StackPane root = new StackPane(); // 仅在Android平台加载广告 if (Platform.isAndroid()) { Platform.runLater(() -> { Context context = (Context) LifecycleService.getInstance().getPlatform().get("activity"); AdView adView = new AdView(context); // 设置广告尺寸和测试AdUnitID(正式环境替换为你的ID) adView.setAdSize(AdSize.BANNER); adView.setAdUnitId("ca-app-pub-3940256099942544/6300978111"); // 加载广告请求 AdRequest adRequest = new AdRequest.Builder().build(); adView.loadAd(adRequest); // 将AdView嵌入到JavaFX界面 SwingNode swingNode = new SwingNode(); swingNode.setContent(adView); root.getChildren().add(swingNode); }); } return new View(root, HOME_VIEW); }); } @Override public void postInit(Scene scene) { // 应用初始化后的配置 } }
3. 编译与测试
执行以下命令编译Android应用:
mvn clean gluonfx:build gluonfx:package -Pandroid
注意:测试阶段使用Google提供的测试AdUnitID,避免违反AdMob政策;正式发布前替换为你自己的AdUnitID和App ID。
内容的提问来源于stack exchange,提问作者Paul Kocian
相关产品推荐
相关产品推荐

