You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在GluonFX移动插件中使用Android原生类及集成AdMob SDK?

解决GluonFX集成Android原生类与AdMob的问题

我是GluonFX新手,已按官方文档通过Maven创建项目并成功编译,现在想实现两个需求:

  1. 使用Android SDK中的android.os.Vibrator、Toast等原生类
  2. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 05:09:53