【UE】UMG安卓相关问题

1.获取控件的运行时实际大小

使用控件的缓存几何体,获取绝对大小就能得到运行时控件大小。

实际的输出会将视口的缩放计算进去,即显示的多大就是多大。

如果想得到控件你自己设置的大小,可以从缓存几何体中获取本地大小,或者转换插槽依靠属性直接获取。

注:

GetDesiredSize()中文显示为获取所需大小,但实际上并不能获取到运行时大小。获取到的是预期的大小。

链接: UMG Widget GetDesiredSize()

2.打包安卓点击位置和UMG实际生效位置不符

造成这个问题可能有多种原因,注意原来自己设置了什么。像什么DPI缩放规则什么的。

我遇到的原因是UE5.6版本开启了Use disaply cutout region?该选项默认是关的。

这是用于适配安卓各种刘海,水滴屏,开启这个才可以全屏显示,没有黑边。

将该选项关闭,就不会出现错位了。

正常Use disaply cutout region?该选项应该是可以开启的,造成位置不符的问题应该是全屏开启了,但是UI没有全屏显示,还是有黑边的状态,所以错位了。

下文有怎么解决黑边。

3.打包Android全屏显示,抹除黑边

正常勾选Use disaply cutout region?即可全屏显示

但我的工程不行,我去找了各种文章,用于解决黑邊問題都于事无补。

参考如下:

链接: 【UE4】Android无法全屏(如何找到打包时GameActivity来源)-全屏代码如何实现

链接: Need advice on making Android game fullscreen

链接: Unreal Engine 5.6 Blueprint Android "Display cutout region" error problem

链接: Unreal发布Android在刘海屏手机上不能全屏显示问题

核心问题是UE生成的java代码中有关于机型的判断,大部分文章都说要注释了

UseDisplayCutout部分。

但我测试后仍然无效。

测试了5.7版本就好的

想想不清楚是不是我没有指定安卓sdk,ndk那些东西的关系。。。但是我用5.7也没有指定哪些玩意,他就是好的,而且5.7没有修改引擎的相关东西。

又测试了5.4。将引擎的SplashActivity.java中的UseDisplayCutout=false注释,然后将工程的中间文件删除重新打包生成也是可以的

最后5.6将工程所有额外插件关闭,修改引擎的SplashActivity.java文件,中间文件删除,重新打包可以了,说明还是工程插件问题!中间还需要的需要授权的问题,下文有写。

有些时候好像UE有缓存还是怎样,最好在修改完源码重启?具体不清楚。

记得注意下Show launch image是否勾选,没有勾也不会全屏。

结果:

4.UE5.6打包安卓出现permission required you must approve this premission in app settings: storage弹窗

链接: UE5 打包安卓后出现permission required you must approve this premission in app settings: storageg弹单窗

解决办法还是改源码

其实通过源码可以看出来,只有打的包不是发布包或者没有开启用拓展文件夹的情况下,才会申请权限,才会出弹窗。

所以要么打发布包,要么勾选Use ExternalFilesDir for UnrealGame files?,要么注释了那句代码。

4.1 UE5.6打shipping发布包

配置UE的发布配置,然后勾选用于分发,配置好key,勾选Use ExternalFilesDir for UnrealGame files?,应该就不会出弹窗

参考链接: 【UE5】打包的apk为什么总是在启动时申请存储权限?即使是Shipping包


4.2 UE5.6打Development开发包

UE5.6引擎的发布版本去注释那串源代码无效,如果就是想打包测试一下效果,临时打开发包,可以使用adb直接给app权限

c 复制代码
adb shell pm grant <your.package.name> android.permission.WRITE_EXTERNAL_STORAGE

或者创建UPL

参考链接: 虚幻5.6 UPL解决打包安卓卡启动权限请求

视频中的UPL方法我没有测通,放在Build/Android/Java下,最后会运行那个UPL但是语法内容好像不对还是咋这,最后没效果。

我自己寻找到了一个方法,也是写UPL

1--在build.cs中添加如下代码

csharp 复制代码
if (Target.Platform == UnrealTargetPlatform.Android)
		{
			string PluginPath = Utils.MakePathRelativeTo(ModuleDirectory, Target.RelativeEnginePath);
			AdditionalPropertiesForReceipt.Add("AndroidPlugin", System.IO.Path.Combine(PluginPath, "ClearStartupPermissions_UPL.xml"));
		}

2--在build.cs同级文件夹下创建ClearStartupPermissions_UPL.xml文件,这个名字对应代码中的名字。

3--ClearStartupPermissions_UPL.xml文件内容为UPL语法代码,如果仅仅是添加元素会报错。所以需要先删除,然后再添加空值(添加这一步可选,不添加也没啥事)。

参考文章链接:
UE----UPL使用文档
虚幻插件语言
UPL for Android

xml 复制代码
<?xml version="1.0" encoding="utf-8"?>
<root xmlns:android="http://schemas.android.com/apk/res/android">
    <trace enable="true" />
    <androidManifestUpdates>
        <loopElements tag="meta-data">
            <setStringFromAttribute result="ApplicationSectionName" tag="$" name="android:name"/>
            <setBoolIsEqual result="bUseExternalFilesDir" arg1="$S(ApplicationSectionName)" arg2="com.epicgames.unreal.GameActivity.StartupPermissions"/>
            <if condition="bUseExternalFilesDir">
                <true>
                    <removeElement tag="$"/>
                    <log text="移除了com.epicgames.unreal.GameActivity.StartupPermissions"/>
                </true>
            </if>
        </loopElements>
        <addElements tag="application">
            <meta-data android:name="com.epicgames.unreal.GameActivity.StartupPermissions" android:value=""/>
            <log text="添加了com.epicgames.unreal.GameActivity.StartupPermissions"/>
        </addElements>
    </androidManifestUpdates>
    <trace enable="false" />
</root>


最后结果,虽然有点错位

UPL代码中的log一行在第一次打出包的时候会出错,我将中间文件啥都删了,重新打包,就报错,注释完能打包出来,再加回去就好可以显示日志了,我真服了。。。

5.Could not open settings generic class cache for settings file 'C:\Users\xxx...\android\settings.gradle' BUG!

一开始我使用5.6的UE自动工具打包安卓,自动下载sdk,ndk那些。可以打包

转到UE5.4就提示Could not open settings generic class cache for settings file 'C:\Users\xxx...\android\settings.gradle' BUG!

这个是jdk和那些玩意不匹配

5.4自己下载jdk17,然后在UE中指定一下AndroidSDK里的Location of JAVA

我上传的CSDN的下载链接: link

官网下载链接链接: Java Downloads

6.ld.lld: error: undefined symbol: std::__ndk1::__libcpp_verbose_abort(char const*, ...)

打开AndroidStudio重新下载ndk,或者将所有的ndk都卸了,然后用UE的自动化工具下载,防止版本不对。

5.4以上的版本都不用指定AndroidSDK了,如下图。

但是切UE版本打包还是会有问题,因为每个版本需要的sdk不一样。

相关推荐
GLDbalala3 小时前
Unity基于自定义管线实现经典经验光照模型
unity·游戏引擎
游戏开发爱好者84 小时前
日常开发与测试的 App 测试方法、查看设备状态、实时日志、应用数据
android·ios·小程序·https·uni-app·iphone·webview
王码码20354 小时前
Flutter for OpenHarmony 实战之基础组件:第三十一篇 Chip 系列组件 — 灵活的标签化交互
android·flutter·交互·harmonyos
黑码哥4 小时前
ViewHolder设计模式深度剖析:iOS开发者掌握Android列表性能优化的实战指南
android·ios·性能优化·跨平台开发·viewholder
亓才孓4 小时前
[JDBC]元数据
android
独行soc4 小时前
2026年渗透测试面试题总结-17(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮
金融RPA机器人丨实在智能4 小时前
Android Studio开发App项目进入AI深水区:实在智能Agent引领无代码交互革命
android·人工智能·ai·android studio
科技块儿4 小时前
利用IP查询在智慧城市交通信号系统中的应用探索
android·tcp/ip·智慧城市
独行soc5 小时前
2026年渗透测试面试题总结-18(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮
王码码20355 小时前
Flutter for OpenHarmony 实战之基础组件:第二十七篇 BottomSheet — 动态底部弹窗与底部栏菜单
android·flutter·harmonyos