Android端JavaFX应用Clipboard复制到剪贴板失效如何解决
问题根因
JavaFX 自带的javafx.scene.input.ClipboardAPI在GluonFX原生编译的Android环境下存在适配缺失:桌面端运行时这套API可以直接对接系统剪贴板正常工作,但在Android端的GraalVM原生镜像里,自带实现没有正确调用Android系统的ClipboardManager系统服务,写入的内容仅存在于当前应用进程内存中,没有真正写入全局系统剪贴板,因此第三方应用(比如Gmail)粘贴时只能读到之前剪贴板留存的旧内容,拿不到你刚写入的日志。
修复方案
直接替换成Gluon Attach套件里专门做多平台适配的剪贴板服务即可,你当前使用的4.0.14-SNAPSHOT版本Attach已经内置了稳定的剪贴板实现,不需要额外升级版本,按以下步骤修改:
- 首先在项目pom.xml中补充剪贴板服务的依赖:
<dependency> <groupId>com.gluonhq.attach</groupId> <artifactId>clipboard</artifactId> <version>${attach-version}</version> </dependency>
- 替换按钮点击事件里的原有剪贴板逻辑,删掉JavaFX原生Clipboard相关代码,改用Attach的服务调用:
copyButton.setOnAction(e -> { String log = console.getItems().stream().collect(Collectors.joining(System.lineSeparator())); Services.get(ClipboardService.class).ifPresent(clipboardService -> { clipboardService.setString(log); }); new Toast("Copied to clipboard").show(); });
- 不需要额外配置Android权限,Android 3.0以上版本写入剪贴板不需要申请特殊权限,重新执行
mvn gluonfx:build gluonfx:package打包安装到设备即可。
补充说明:这个ClipboardService是跨平台自动适配的,桌面端、Android、iOS端运行时会自动调用对应平台的原生剪贴板接口,不需要手写平台判断分支,桌面端原有复制粘贴功能不会受任何影响。
内容的提问来源于stack exchange,提问作者user1803551
相关产品推荐
相关产品推荐

