对于声明方向或可调整大小限制的应用,Android 会激活兼容模式。兼容模式可确保大屏幕设备和可折叠翻盖手机上的应用行为可以接受,但用户体验可能不佳。
每个应用的覆盖 使设备制造商能够更改应用行为以改善用户体验或防止应用在特定设备上出现故障。
参考设备
以下设备可能需要每个应用的覆盖,因为配置异常或配置不受应用良好支持。
- 平板电脑: 一些平板电脑(例如 Pixel 平板电脑)的自然方向为横向。当
Display#getRotation()
返回Surface.ROTATION_0
时,设备处于其自然方向。如果应用假设ROTATION_0
为纵向,则应用布局和相机预览可能与设备显示不匹配。 - 横向可折叠设备: 一些可折叠设备(例如 Pixel Fold)在折叠时处于纵向方向,但在展开时处于横向方向。如果应用假设展开后的方向为纵向,则可能会出现 闪烁循环 或布局问题。
- 可折叠翻盖手机: 展开的翻盖手机通常处于纵向方向。但是,折叠时,手机通常具有一个处于横向方向的小型显示屏。应用必须识别并适应显示屏的不同方向。
常见的兼容性问题
应用最常因应用方向限制、可调整大小和纵横比限制、相机预览方向处理不当以及 API 使用不当而遇到兼容性问题。
黑边
黑边将应用放置在屏幕中央,或在大屏幕上放置在一边,以方便访问。黑边(纯色条或模糊壁纸)填充应用两侧或顶部和底部未使用显示区域。
黑边经常发生在大屏幕设备上,因为设备显示的尺寸和纵横比通常与大多数应用设计的标准手机不同。
问题
应用不支持所有显示配置,因为应用具有固定方向、固定纵横比或不可调整大小。
控制应用方向和可调整大小的配置设置包括以下内容
screenOrientation
: 指定应用程序的固定方向。应用程序还可以使用Activity#setRequestedOrientation()
在运行时设置方向。resizeableActivity
: 指示系统是否可以调整应用程序的大小以适应不同尺寸的窗口。在 Android 11(API 级别 30)及更低版本上,指定应用程序是否支持多窗口模式。在 Android 12(API 级别 31)及更高版本上,指定应用程序是否支持小屏幕(紧凑 窗口大小类)上的多窗口模式。在 Android 12 及更高版本上,无论此设置如何,应用程序都支持大屏幕(中等或扩展窗口大小类)上的多窗口模式。maxAspectRatio
: 指定应用程序支持的最大纵横比。只有将resizeableActivity
设置为false
的应用程序才能设置maxAspectRatio
。minAspectRatio
: 指定应用程序支持的最小纵横比。只有将resizeableActivity
设置为false
的应用程序才能设置minAspectRatio
。
优化
应用程序应支持所有设备和 多窗口模式 显示方向和大小。从应用程序布局和应用程序清单文件中删除所有方向和固定纵横比限制。
兼容性解决方法
如果具有固定方向或固定纵横比的应用程序在应用程序不支持窗口大小或方向的窗口中运行,Android 会给应用程序添加黑边以保持连续性。
从 Android 12(API 级别 31)开始,并继续在 12L(API 级别 32)中,平台对添加了黑边的应用程序应用了各种增强功能。设备制造商实施 UI 增强功能。您无需对应用程序进行任何额外开发即可从这些改进中获益。
Android 12(API 级别 31)引入了以下美学增强功能,设备制造商可以对其进行配置
- 圆角:应用程序窗口的角具有更精致的外观。
- 系统栏透明度:状态栏和导航栏(覆盖在应用程序上)是半透明的,使栏上的图标始终在黑边背景上可见。
- 可配置纵横比:应用程序的纵横比可以调整以改善应用程序的外观。
12L(API 级别 32)增加了以下功能改进
可配置位置:在大屏幕上,设备制造商可以将应用程序定位到显示屏的左侧或右侧,从而使交互更容易。
重新设计的重启按钮:设备制造商可以为 尺寸兼容模式 的重启按钮提供新的外观,以便用户更容易识别。
Android 13(API 级别 33)添加了一个用户教育对话框,介绍了在屏幕上定位添加了黑边的应用程序或将黑边包含在分屏模式中。
尺寸兼容模式
尺寸兼容模式是一种添加黑边的模式,包括一个重启控件。该控件使用户能够重启应用程序并重新绘制显示。Android 会为确定为不可调整大小的应用程序调用尺寸兼容模式。当活动移动到与活动尺寸不兼容的显示容器时,系统可能会调整应用程序的大小以至少在一个维度上填充设备显示屏。
可能触发尺寸兼容模式的设备配置更改包括以下内容
- 设备旋转
- 可折叠设备折叠或展开
- 在全屏和分屏显示模式之间切换
问题
尺寸兼容模式通常适用于方向或纵横比受限制且配置为(或由系统确定为)不可调整大小的活动。
如果您的应用程序满足以下任何条件,则会被视为可调整大小,并且不会进入尺寸兼容模式
- 使用
resizeableActivity="true"
可调整大小 - 支持 画中画 (PIP) 模式
- 已 嵌入
- 已应用设备制造商的
FORCE_RESIZE_APP
每应用程序覆盖(忽略由应用程序设置的属性)
如果您的应用程序不满足任何条件,则会被视为不可调整大小,并且可能会进入尺寸兼容模式。
优化
应用程序应支持所有显示尺寸。通过在应用程序清单中将 <activity>
或 <application>
元素的 android:resizeableActivity
属性设置为 true
来使您的应用程序可调整大小。为您的应用程序设计响应式/自适应布局。有关更多信息,请参阅 支持不同的屏幕尺寸 和 支持多窗口模式。
兼容性解决方法
当系统确定通过调整应用程序的大小以至少在一个维度上填充显示窗口可以改善添加了黑边的应用程序的显示时,Android 会将应用程序置于尺寸兼容模式下。系统会显示一个重启控件,该控件会重新创建应用程序进程,重新创建活动并重新绘制显示。另请参阅 进程和线程概述。
闪烁循环
当应用程序不支持所有显示方向时,它可能会在发生配置更改时重复请求新的方向,从而创建一个无限循环,使显示闪烁或应用程序无休止地旋转。
问题
在 Android 12(API 级别 31)及更高版本上,设备制造商可以配置其设备以忽略应用程序指定的方位限制,而改为强制执行兼容模式。例如,可折叠设备可以在活动显示在设备的横向平板尺寸的内屏上时忽略活动的 android:screenOrientation="portrait"
设置。
如果忽略应用程序的方位限制,应用程序可以通过调用 Activity#setRequestedOrientation()
以编程方式设置其方向。如果应用程序未处理配置更改(请参阅 处理配置更改),则该调用会触发应用程序重启。重启后,应用程序的方向限制将再次被忽略,应用程序会重复调用 setRequestedOrientation()
,该调用会触发应用程序重启,依此类推,形成一个自我维持的循环。
您可能会在以下情况下遇到这种情况:当设备屏幕的 自然方向(由 Android 确定的正常方向)为横向(即,调用 Display#getRotation()
返回 Surface.ROTATION_0
且设备具有横向纵横比)时。历史上,应用程序一直假设 Display.getRotation() = Surface.ROTATION_0
表示设备处于纵向模式,但这并不总是这样,例如,在某些可折叠设备的内屏上以及在某些平板电脑上。
在可折叠内屏上处于横向模式的应用程序可能会检查屏幕旋转,收到 ROTATION_0
值,假设设备的自然方向为纵向,并调用 setRequestedOrientation(
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
)
来重新配置应用程序布局。应用程序重启后(处于横向模式),它可能会再次检查屏幕旋转,收到 ROTATION_0
值,调用 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
,并继续无限循环。
优化
应用程序不应执行以下操作
- 在活动
onCreate()
方法中使用Activity#setRequestedOrientation()
设置默认方向,因为方向请求可能会由于未处理的配置更改而意外触发 - 假设设备的自然方向(
ROTATION_0
)为纵向 - 根据与当前窗口大小无关的信号设置方向,例如
Display#getRotation()
、FoldingFeature
的存在或 已弃用的 API。
兼容性解决方法
Android 在以下情况下会忽略对 Activity#setRequestedOrientation()
的调用
活动已从对该方法的先前调用中重新启动,或者已启用相机兼容性强制旋转处理(请参阅以下 相机预览)。
设备制造商可以将此行为应用于使用
OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION
的应用程序。活动在一秒钟内发出了超过两次方向请求,这表明发生了循环。在循环中的两次请求中,Android 会使用最大化应用程序显示区域的请求。
设备制造商可以将此行为应用于使用
OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED
的应用程序。
相机预览
相机应用程序的相机预览(或取景器)在平板电脑、笔记本电脑和可折叠显示屏上可能对齐错误或失真。
问题
Android 兼容性定义文档 指出,相机图像传感器“必须定向,使相机的长边与屏幕的长边对齐”。
应用程序通常假设设备方向和相机传感器方向为纵向,这是一个在标准手机上合理的假设。但平板电脑和笔记本电脑及其相机传感器的自然方向可能是横向。此外,可折叠设备等新型式可能具有多个自然方向和多个方向不同的相机传感器。
使用应用程序不希望的相机方向启动活动,或在不同的相机或设备屏幕(对于可折叠设备)之间切换会导致相机预览对齐错误或失真。
优化
相机应用必须正确识别和管理设备方向和相机传感器方向,以呈现正确对齐和缩放的相机预览。应用必须计算设备旋转、传感器旋转和屏幕或窗口纵横比,然后将结果应用于相机预览。有关详细指南,请参阅相机预览和Introducing Camera Viewfinder。
兼容性解决方法
当Display#getRotation()
返回Surface.ROTATION_0
时,设备处于自然方向。系统根据设备的自然方向计算CameraCharacteristics.SENSOR_ORIENTATION
。Android 将纵向限制应用的纵向窗口与设备的自然方向对齐,这正是大多数应用所期望的。当传感器方向为横向而相机预览为纵向时,Android 也会裁剪相机传感器图像。具体解决方法包括:
强制旋转纵向限制应用的相机预览:纵向限制应用期望设备的自然方向和相机传感器方向为纵向。但是,在 Android 12(API 级别 31)及更高版本中,如果设备制造商忽略方向规范,应用可以在多个设备方向上运行。
当纵向限制应用连接到相机时,Android 会强制旋转应用,以使应用纵向窗口与设备的自然方向对齐。
在一些平板电脑上(参见参考设备),应用纵向窗口会旋转为全屏纵向,以与设备的自然方向对齐。强制旋转后,应用占据整个屏幕。
在折叠屏的横向内屏上(参见参考设备),仅限纵向的活动会旋转为横向,以与展开后的自然方向对齐。强制旋转后,应用会被黑边。
内屏前置摄像头裁剪:一些折叠屏上的内屏前置摄像头传感器处于横向方向。除了在折叠屏内屏上强制旋转相机预览外,Android 还裁剪内屏前置(横向)摄像头视野,使传感器捕获与设备方向相反的视图。
强制刷新相机预览:强制旋转后,系统会循环遍历活动方法
onStop()
和onStart()
(默认)或onPause()
和onResume()
(由OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE每个应用覆盖应用),以确保相机预览正确显示。纵横比缩放:系统会动态更改强制旋转的相机预览的纵横比,使其具有更高的最小纵横比,从而确保相机预览正确缩放。
如果应用正确处理相机预览,应用开发者可以覆盖这些解决方法。参见每个应用覆盖。
常用误用 API
随着 Android 添加了对多窗口模式和折叠屏等功能的支持,传统的 API 已被弃用,并被适用于所有显示尺寸和设备外形的最新 API 所取代。但是,弃用的 API 仍然可用于向后兼容。
一些View
API 是为特殊目的而设计的,开发者并不总是清楚其含义。
问题
开发者继续使用已弃用的Display
API,并错误地认为这些 API 返回的是应用边界,而不是设备显示区域边界。或者,开发者错误地使用特殊用途的视图 API 来获取常规的显示指标。结果是,在应用窗口调整大小事件后重新定位 UI 元素时出现误差,导致布局问题。
已弃用且常用误用的 Display API
有关更多信息,请参阅支持多窗口模式。
误用过的视图 API
优化
切勿依赖物理显示尺寸来定位 UI 元素。将您的应用迁移到基于WindowMetrics
的 API,包括以下WindowManager
API
平台
Jetpack
兼容性解决方法
两个覆盖会调整已弃用的Display
API 和误用过的View
API,以返回应用边界:ALWAYS_SANDBOX_DISPLAY_APIS
用于Display
API;OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS
用于View
API。ALWAYS_SANDBOX_DISPLAY_APIS
也默认应用于符合尺寸兼容模式的应用。
透明活动
透明活动是透明背景样式的结果,例如
<style name="Transparent" parent="AppTheme">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
</style>
与对话框相关的主题,如Theme.MaterialComponents.Dialog
,可以包含使活动透明的样式。
透明活动不会覆盖所有可用的显示空间,这使得它们难以管理,因为可用的显示区域可能会根据配置更改而变化,例如设备旋转、设备折叠和展开以及多窗口模式。
问题
透明活动应该符合任务活动堆栈中透明活动下方第一个不透明活动的边界。但是,启动权限对话框的不透明活动可以是弹跳板(启动另一个活动然后消失的活动);因此,系统无法确定启动透明权限对话框活动的弹跳板活动的边界。
优化
透明活动从任务活动堆栈中它们下方最上面的不透明活动继承其约束。不透明活动必须在透明活动的整个生命周期内可用,从活动创建到销毁。出于这个原因,不要从弹跳板活动启动权限请求。
如果弹跳板活动启动权限请求,用户可能无法看到权限对话框,因为弹跳板活动将在用户有机会对对话框做出响应之前被销毁,并且对话框活动的尺寸和位置可能计算错误。
应用应始终从保持可见的活动启动权限请求,直到用户做出权限决定。
圆角
活动可以是透明的,因为存在指定背景透明度的样式,或者因为活动的內容未填充可用的显示空间。如果透明活动填充了可用的显示空间,系统会在设备制造商配置为这样做的情況下,自动将圆角应用于活动。但是,如果透明活动(如权限对话框)未填充可用空间,则由您决定是否应用圆角。
权限对话框不会填充可用的显示空间,因为对话框布局通常使用LayoutParams.WRAP_CONTENT,而不是LayoutParams.MATCH_PARENT。
兼容性解决方法
让启动对话框活动的活动保持可见,直到用户对对话框做出响应。
系统确保透明活动从活动堆栈中透明活动下方第一个不透明活动继承所有约束,包括与以下内容相关的约束
- 尺寸兼容模式
- 方向
- 纵横比
Unity 游戏
Unity 游戏在 Android 上全屏运行或以多窗口模式运行。但是,许多 Unity 游戏在应用被置于多窗口模式时会失去焦点并停止绘制內容。
问题
Unity 在 Unity 2019.4 中添加了Resizable Window
选项,以支持 Android 上的多窗口模式。但是,初始实现没有正确响应多窗口模式下的活动生命周期,导致 UnityPlayer 在应用失去焦点时暂停播放。播放器渲染黑屏或游戏最后被冻结的帧。只有当用户点击屏幕时,游戏才恢复。许多使用 Unity 引擎的应用都遇到了这个问题,并在多窗口模式下呈现为黑色窗口。
优化
将 Unity 升级到 2019.4.40 或更高版本,然后重新导出您的游戏。在Android 播放器设置中保持Resizable Window
选项选中,否则即使游戏在多窗口模式下完全可见,也会在失去焦点时暂停。
兼容性解决方法
设备制造商可以应用OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS
每个应用覆盖,以在多窗口模式下向应用提供虚假焦点事件。覆盖使活动能够重新绘制内容,而不是变黑。
测试您的应用以查找兼容性问题
要测试您的应用并了解其在不同外形尺寸上的行为,请利用以下资源
- 设备流式传输:要测试您在 Google 数据中心托管的生产设备(包括参考设备)上的应用,请参阅Android 设备流式传输,由 Firebase 提供支持
- Android Studio Hedgehog 中的模拟器:有关为参考设备创建模拟器的信息,请参阅创建和管理虚拟设备
- Android Studio 可调整大小的模拟器:有关访问虚拟设备的信息,请参阅在 Android 模拟器上运行应用
是否被黑边
验证每个活动是否可以使用应用可用的所有显示空间。首先,在您的测试文件夹中声明以下代码
Kotlin
fun Activity.isLetterboxed() : Boolean { if (isInMultiWindowMode) return false val wmc = WindowMetricsCalculator.getOrCreate() val currentBounds = wmc.computeCurrentWindowMetrics(this).bounds val maxBounds = wmc.computeMaximumWindowMetrics(this).bounds val isScreenPortrait = maxBounds.height() > maxBounds.width() return if (isScreenPortrait) { currentBounds.height() < maxBounds.height() } else { currentBounds.width() < maxBounds.width() } }
Java
public boolean isLetterboxed(Activity activity) { if (activity.isInMultiWindowMode()) { return false; } WindowMetricsCalculator wmc = WindowMetricsCalculator.getOrCreate(); Rect currentBounds = wmc.computeCurrentWindowMetrics(activity).getBounds() Rect maxBounds = wmc.computeMaximumWindowMetrics(activity).getBounds(); boolean isScreenPortrait = maxBounds.height() > maxBounds.width(); return (isScreenPortrait) ? currentBounds.height() < maxBounds.height() : currentBounds.width() < maxBounds.width(); }
然后运行测试以断言行为,并确保目标活动不被黑边
Kotlin
@get:Rule val activityRule = ActivityScenarioRule(MainActivity::class.java) @Test fun activity_launched_notLetterBoxed() { activityRule.scenario.onActivity { assertThat(it.isLetterboxed()).isFalse() } }
Java
@Rule public ActivityScenarioRule<MainActivity> rule = new ActivityScenarioRule<>(MainActivity.class); public void activity_launched_notLetterBoxed() { try (ActivityScenario<MainActivity> scenario = ActivityScenario.launch(MainActivity.class)) { scenario.onActivity(activity -> { assertThat(isLetterboxed(activity)).isFalse(); }); } }
理想情况下,仅在测试通过并断言您的应用活动占用应用可用的整个显示空间时才运行此类测试。在所有设备类型上测试您的应用,以确保一致的行为。
每个应用覆盖
Android 提供覆盖,可以更改应用的配置行为。例如,FORCE_RESIZE_APP
覆盖指示系统绕过尺寸兼容模式,并调整应用大小以适合显示尺寸,即使resizeableActivity="false"
在应用清单中指定。
设备制造商会在特定的大屏幕设备上将覆盖应用于选定的应用 - 或所有应用。在 Android 14(API 级别 34)及更高版本中,用户可以通过设备设置将覆盖应用于应用。
用户每个应用覆盖
在 Android 14 及更高版本中,设置菜单使用户能够更改应用的纵横比。大屏幕设备(如参考设备)实现了该菜单。
菜单包含设备上安装的所有应用的列表。用户选择一个应用,然后将应用纵横比设置为 3:4、1:1、全屏或其他由设备制造商配置的值。用户也可以将纵横比重置为应用默认值,该值在应用清单中指定。
应用可以通过设置以下 PackageManager.Property
标签来选择退出兼容性覆盖。
PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE
要选择退出用户纵横比兼容性覆盖,请将该属性添加到您的应用清单中,并将值设置为
false
。<application> <property android:name="android.window. PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE" android:value="false" /> </application>
您的应用将从设备设置中的应用列表中排除。用户将无法覆盖应用的纵横比。
将该属性设置为
true
不会产生任何影响。PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_FULLSCREEN_OVERRIDE
要选择退出用户纵横比兼容性覆盖的全屏选项,请将该属性添加到您的应用清单中,并将值设置为
false
。<application> <property android:name="android.window.PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_FULLSCREEN_OVERRIDE" android:value="false" /> </application>
全屏选项将从设备设置中的纵横比选项列表中移除。用户将无法对您的应用应用全屏覆盖。
将该属性设置为
true
不会产生任何影响。
针对所有屏幕优化您的应用: 不要在您的应用中设置纵横比限制。使用 窗口大小类 来根据可用显示空间的大小支持不同的布局。
设备制造商的每个应用覆盖
设备制造商会在选定的设备上针对每个应用应用覆盖。参考设备 默认情况下可能会对各种应用应用某些覆盖。
应用可以选择退出大多数覆盖(请参阅下面的 每个应用覆盖 表)。
您可以使用兼容性框架测试启用了或禁用了覆盖的应用(请参阅 兼容性框架工具)。启用后,覆盖将应用于整个应用。
您还可以使用 Android 调试桥 (adb) 来启用或禁用覆盖并确定哪些覆盖适用于您的应用。
按如下方式启用或禁用覆盖
adb shell am compat enable/disable <override name/id> <package>
对于 参考设备,请检查哪些覆盖适用于您的应用
adb shell dumpsys platform_compat | grep <package name>
下表列出了可用的覆盖以及有关如何优化应用以使其不需要依赖覆盖的指导。您可以将属性标志添加到应用清单中以选择退出某些覆盖。
每个应用覆盖 | |||
---|---|---|---|
类型 | 名称 | ID | 说明 |
可调整大小 | FORCE_RESIZE_APP | 174042936 | 绕过应用在配置更改时的尺寸兼容模式。 |
FORCE_NON_RESIZE_APP | 181136395 | 在配置更改时强制应用进入尺寸兼容模式。 | |
纵横比 | OVERRIDE_MIN_ASPECT_RATIO | 174042980 | 必须启用的门控器覆盖,才能应用任何其他纵横比覆盖。 |
OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY | 203647190 | 如果启用(默认情况下),则将覆盖范围限制为仅纵向活动。 | |
OVERRIDE_MIN_ASPECT_RATIO_MEDIUM | 180326845 | 将最小纵横比更改为 3:2。 | |
OVERRIDE_MIN_ASPECT_RATIO_LARGE | 180326787 | 将最小纵横比更改为 16:9。 | |
OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN | 208648326 | 将最小纵横比更改为适合显示尺寸的 50%(或分屏纵横比)。 | |
OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN | 218959984 | 禁用最小纵横比覆盖,以便应用在设备处于纵向模式时全屏显示。 | |
方向 | OVERRIDE_ANY_ORIENTATION | 265464455 | 启用覆盖任何方向。 |
OVERRIDE_ANY_ORIENTATION_TO_USER | 310816437 | 覆盖方向、可调整大小和纵横比限制。 | |
OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT | 265452344 | 在活动具有未定义的方向时,将方向覆盖为纵向。 | |
OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR | 265451093 | 在活动具有未定义的方向时,将方向覆盖为 nosensor (使用设备的自然方向)。 |
|
OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE | 266124927 | 将仅横向应用旋转 180 度。 | |
OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA | 265456536 | 将方向覆盖范围限制为应用连接到相机时。 | |
OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION | 255940284 | 在任务全屏显示时(包括字母盒显示时)将显示设置为固定横向自然方向。 | |
OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION | 254631730 | 忽略应用的方位请求以避免方位无限循环。 | |
OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED | 273509367 | 在活动重新启动时忽略重复的方向请求。如果 Android 检测到应用在 1 秒内请求至少两个新方向,则系统认为这是一个方位无限循环,并应用覆盖。 | |
OVERRIDE_RESPECT_REQUESTED_ORIENTATION | 236283604 | 通过禁用设备制造商忽略方向请求设置来防止字母盒显示。 | |
沙盒 API | NEVER_SANDBOX_DISPLAY_APIS | 184838306 | 防止更改任何显示 API 的行为。 |
ALWAYS_SANDBOX_DISPLAY_APIS | 185004937 | 强制应用中的 Display API 返回应用边界。 Display API 返回逻辑显示区域边界,但有时应用假设 Display API 返回应用边界,这会导致 UI 问题。 |
|
OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS | 237531167 | 强制应用中使用的 View API 返回应用边界。 View API 返回逻辑显示区域边界,但有时应用假设 View API 返回应用边界,这会导致 UI 问题。 |
|
相机兼容性 | OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION | 263959004 | 关闭强制旋转。默认情况下,所有固定方向相机应用在打开相机预览时都会强制旋转。 |
OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH | 264304459 | 移除在强制旋转相机预览时应用的默认硬刷新。 | |
OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE | 264301586 | 在强制旋转相机预览时将硬刷新切换为软刷新,这有助于在强制旋转期间保留状态。默认情况下,Android 在强制旋转相机预览时会应用硬刷新。硬刷新会导致应用丢失状态或变黑,具体取决于应用如何缓存其先前状态。 | |
OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT | 250678880 | 裁剪内部前置摄像头的图像缓冲区。如果覆盖已禁用,则会移除内部前置摄像头裁剪,并且相机预览的视野会增加。默认情况下,在某些折叠设备(请参阅 参考设备)上,系统会在使用内部前置摄像头时裁剪所有相机应用的相机预览。 | |
其他 | OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS | 263259275 | 防止应用在应用在分屏模式下失去焦点时变黑。应用在绘制应用内容之前会等待获得焦点,这会导致应用冻结或变黑。覆盖允许 Android 向应用发送伪焦点事件,这会向应用发出信号,使其开始再次绘制内容。 |
FORCE_RESIZE_APP
强制将覆盖应用于其的包设置为可调整大小。不会更改应用是否可以进入多窗口模式,但允许应用在屏幕调整大小时调整大小,而无需进入尺寸兼容模式。
应用如何实现与覆盖相同的效果
在应用清单中,将 android:resizeableActivity
属性设置为 true
,或者,要支持调整大小,同时使用 android:resizeableActivity=false
禁用多窗口模式,请将 android.supports_size_changes
元数据标志设置为 true
。
如何优化应用
使用响应式/自适应布局,使应用能够适应所有显示尺寸和纵横比。请参阅 支持不同的屏幕尺寸。
如何禁用或选择退出覆盖
将属性标志 PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES
设置为 false
。
调整覆盖的属性标志
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES"
android:value="true|false"/>
用于测试覆盖的 adb 命令
要应用覆盖并使应用可调整大小
adb shell am compat enable FORCE_RESIZE_APP <package>
要移除覆盖
adb shell am compat disable FORCE_RESIZE_APP <package>
注意: 这些命令只会临时应用或移除覆盖。
FORCE_NON_RESIZE_APP
强制将覆盖应用于其的包设置为不可调整大小,并在配置更改时进入尺寸兼容模式。
应用如何实现与覆盖相同的效果
在应用清单中将 android:resizeableActivity
属性和 android.supports_size_changes
元数据标志都设置为 false
,并声明方向或纵横比限制。
如何优化应用
所有在调整大小后表现良好的应用都应该将 android:resizeableActivity
或 android.supports_size_changes
设置为 true
。其他应用应改进,以便在调整大小时表现良好。请参阅 android:resizeableActivity。
如何禁用或选择退出覆盖
将属性标志 PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES
设置为 false
。
调整覆盖的属性标志
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES"
android:value="true|false"/>
用于测试覆盖的 adb 命令
要应用覆盖并使应用不可调整大小
adb shell am compat enable FORCE_NON_RESIZE_APP <package>
要移除覆盖
adb shell am compat disable FORCE_NON_RESIZE_APP <package>
注意: 这些命令只会临时应用或移除覆盖。
OVERRIDE_MIN_ASPECT_RATIO
强制应用特定最小纵横比的所有覆盖的门控器。
应用如何实现与覆盖相同的效果
在活动或应用级别设置 android:minAspectRatio
。
如何优化应用
不要在您的应用中设置纵横比限制。确保您的应用 支持不同的屏幕尺寸。使用窗口大小类来根据应用在屏幕上所占空间的大小支持不同的布局。请参阅 Compose WindowSizeClass
API 和 View WindowSizeClass
API。
如何禁用或选择退出覆盖
指定纵横比限制或将属性标志 PROPERTY_COMPAT_ALLOW_MIN_ASPECT_RATIO_OVERRIDE
设置为 false
。
调整覆盖的属性标志
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_MIN_ASPECT_RATIO_OVERRIDE"
android:value="false"/>
用于测试覆盖的 adb 命令
要应用覆盖
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO <package>
要移除覆盖
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO <package>
注意: 这些命令只会临时应用或移除覆盖。
OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY
限制应用设置,这些设置强制仅纵向方向的活动具有特定最小纵横比。默认情况下启用,并且只有在也启用了 OVERRIDE_MIN_ASPECT_RATIO
时才会生效。
应用如何实现与覆盖相同的效果
请参阅 OVERRIDE_MIN_ASPECT_RATIO。
如何优化应用
请参阅 OVERRIDE_MIN_ASPECT_RATIO。
如何禁用或选择退出覆盖
请参阅 OVERRIDE_MIN_ASPECT_RATIO。
调整覆盖的属性标志
请参阅 OVERRIDE_MIN_ASPECT_RATIO。
用于测试覆盖的 adb 命令
要应用覆盖
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY <package>
要移除覆盖
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY <package>
注意: 这些命令只会临时应用或移除覆盖。
OVERRIDE_MIN_ASPECT_RATIO_MEDIUM
将活动的最小纵横比设置为中等值 (3:2)
应用如何实现与覆盖相同的效果
请参阅 OVERRIDE_MIN_ASPECT_RATIO。
如何优化应用
请参阅 OVERRIDE_MIN_ASPECT_RATIO。
如何禁用或选择退出覆盖
请参阅 OVERRIDE_MIN_ASPECT_RATIO。
调整覆盖的属性标志
请参阅 OVERRIDE_MIN_ASPECT_RATIO。
用于测试覆盖的 adb 命令
要应用覆盖
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_MEDIUM <package>
要移除覆盖
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_MEDIUM <package>
注意: 这些命令只会临时应用或移除覆盖。
OVERRIDE_MIN_ASPECT_RATIO_LARGE
将活动的最小纵横比设置为大值 (16:9)
应用如何实现与覆盖相同的效果
请参阅 OVERRIDE_MIN_ASPECT_RATIO。
如何优化应用
请参阅 OVERRIDE_MIN_ASPECT_RATIO。
如何禁用或选择退出覆盖
请参阅 OVERRIDE_MIN_ASPECT_RATIO。
调整覆盖的属性标志
请参阅 OVERRIDE_MIN_ASPECT_RATIO。
用于测试覆盖的 adb 命令
要应用覆盖
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_LARGE <package>
要移除覆盖
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_LARGE <package>`
注意: 这些命令只会临时应用或移除覆盖。
OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN
启用分屏纵横比的使用。允许应用程序在分屏模式下使用所有可用空间,避免信箱效果。
应用如何实现与覆盖相同的效果
请参阅 OVERRIDE_MIN_ASPECT_RATIO。
如何优化应用
请参阅 OVERRIDE_MIN_ASPECT_RATIO。
如何禁用或选择退出覆盖
请参阅 OVERRIDE_MIN_ASPECT_RATIO。
调整覆盖的属性标志
请参阅 OVERRIDE_MIN_ASPECT_RATIO。
用于测试覆盖的 adb 命令
要应用覆盖
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN <package>
要移除覆盖
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN <package>
注意: 这些命令只会临时应用或移除覆盖。
OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN
禁用纵向全屏模式下的最小纵横比覆盖,以使用所有可用的屏幕空间。
应用如何实现与覆盖相同的效果
请参阅 OVERRIDE_MIN_ASPECT_RATIO。
如何优化应用
请参阅 OVERRIDE_MIN_ASPECT_RATIO。
如何禁用或选择退出覆盖
请参阅 OVERRIDE_MIN_ASPECT_RATIO。
调整覆盖的属性标志
请参阅 OVERRIDE_MIN_ASPECT_RATIO。
用于测试覆盖的 adb 命令
要应用覆盖
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN <package>
要移除覆盖
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN <package>
注意: 这些命令只会临时应用或移除覆盖。
OVERRIDE_ANY_ORIENTATION
启用以下覆盖以覆盖任何方向
- OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT
- OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR
- OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE
应用如何实现与覆盖相同的效果
设置 activity:screenOrientation
清单属性,或使用 Activity#setRequestedOrientation()
API。
如何优化应用
您的应用程序应支持所有方向。方向更改是一种配置更改,可以通过两种方式处理:让系统销毁并重新创建应用程序,或自行管理配置更改。如果您自己管理配置更改,则可以使用 ViewModel
保留应用程序状态。在极少数情况下,您可以决定仅在小型显示屏上锁定方向,但这可能不如让用户根据需要旋转应用程序那样可扩展。在 Android 12L 及更高版本中,固定方向可以被设备配置覆盖。有关处理配置更改和支持所有方向的更多信息,请参阅 处理配置更改、ViewModel 概述 和 在手机上但不在大屏幕设备上限制应用程序方向。
如何禁用或选择退出覆盖
将属性标志 PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE
设置为 false
。
调整覆盖的属性标志
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE"
android:value="true|false"/>
用于测试覆盖的 adb 命令
要应用覆盖
adb shell am compat enable OVERRIDE_ANY_ORIENTATION <package>
要移除覆盖
adb shell am compat disable OVERRIDE_ANY_ORIENTATION <package>
注意: 这些命令只会临时应用或移除覆盖。
OVERRIDE_ANY_ORIENTATION_TO_USER
启用应用程序以填充可用的显示空间。覆盖应用程序清单中指定的任何方向、可调整大小和纵横比限制。此外还忽略对 Activity#setRequestedOrientation()
的任何调用。
应用如何实现与覆盖相同的效果
不要设置
android:screenOrientation
清单属性,或者将属性设置为"user"
。将
android:resizeableActivity
清单属性设置为true
。在小屏幕上,为了支持应用程序调整大小,同时使用
android:resizeableActivity=false
禁用多窗口模式,请将android.supports_size_changes
元数据标志设置为true
。不要设置minAspectRatio
和maxAspectRatio
。
如何优化应用
启用您的应用程序以支持所有方向;不要在应用程序的清单中设置 screenOrientation
规范。通过将应用程序清单中的 android:resizeableActivity
属性设置为 true
,支持应用程序的可调整大小、多窗口模式和所有显示纵横比。请参阅 支持不同的屏幕尺寸。
如何禁用或选择退出覆盖
调整覆盖的属性标志
用于测试覆盖的 adb 命令
要应用覆盖
adb shell am compat enable OVERRIDE_ANY_ORIENTATION_TO_USER <package>
要移除覆盖
adb shell am compat disable OVERRIDE_ANY_ORIENTATION_TO_USER <package>
注意: 这些命令只会临时应用或移除覆盖。
OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT
为包中的所有活动启用纵向方向。除非启用了 OVERRIDE_ANY_ORIENTATION,否则只有在活动没有指定其他固定方向时才会使用该覆盖。
应用如何实现与覆盖相同的效果
如何优化应用
如何禁用或选择退出覆盖
调整覆盖的属性标志
用于测试覆盖的 adb 命令
要应用覆盖
adb shell am compat enable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>
要移除覆盖
adb shell am compat disable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>
注意: 这些命令只会临时应用或移除覆盖。
OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR
为包中的所有活动启用 nosensor 方向。除非启用了 OVERRIDE_ANY_ORIENTATION,否则只有在活动没有指定其他固定方向时才会使用该覆盖。
应用如何实现与覆盖相同的效果
如何优化应用
如何禁用或选择退出覆盖
调整覆盖的属性标志
用于测试覆盖的 adb 命令
要应用覆盖
adb shell am compat enable OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR <package>
要移除覆盖
adb shell am compat disable OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR <package>
注意: 这些命令只会临时应用或移除覆盖。
OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE
为包中的所有活动启用 reverseLandscape 方向。除非启用了 OVERRIDE_ANY_ORIENTATION,否则只有在活动没有指定其他固定方向时才会使用该覆盖。
应用如何实现与覆盖相同的效果
如何优化应用
如何禁用或选择退出覆盖
调整覆盖的属性标志
用于测试覆盖的 adb 命令
要应用覆盖
adb shell am compat enable OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE <package>
要移除覆盖
adb shell am compat disable OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE <package>
注意: 这些命令只会临时应用或移除覆盖。
OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA
将 OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT、OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR 和 OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE 覆盖限制为仅在相机连接处于活动状态时才生效。
应用如何实现与覆盖相同的效果
如何优化应用
如何禁用或选择退出覆盖
调整覆盖的属性标志
用于测试覆盖的 adb 命令
要应用覆盖
adb shell am compat enable OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA <package>
要移除覆盖
adb shell am compat disable OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA <package>
注意: 这些命令只会临时应用或移除覆盖。
OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION
当满足以下条件时,将显示方向限制为横向自然方向
- 活动是全屏模式
- 选择退出组件属性
PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE
未启用 - 设备制造商忽略方向请求设置已为显示启用
- 显示的自然方向是横向
应用如何实现与覆盖相同的效果
不适用。应在应用程序逻辑中解决该问题。
如何优化应用
如何禁用或选择退出覆盖
将属性标志 PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE
设置为 false
。
调整覆盖的属性标志
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE"
android:value="true|false"/>
用于测试覆盖的 adb 命令
要应用覆盖
adb shell am compat enable OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION <package>
要移除覆盖
adb shell am compat disable OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION <package>
注意: 这些命令只会临时应用或移除覆盖。
OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION
启用兼容性策略,该策略在应用程序重新启动或具有活动相机兼容性处理时,会跳过响应应用程序调用 Activity#setRequestedOrientation()
更新应用程序方向。
应用如何实现与覆盖相同的效果
将属性标志 PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION
设置为 true
。
如何优化应用
如何禁用或选择退出覆盖
将属性标志 PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION
设置为 false
。
调整覆盖的属性标志
<property android:name="android.window.PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION"
android:value="true|false"/>
用于测试覆盖的 adb 命令
要应用覆盖
adb shell am compat enable OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION <package>
要移除覆盖
adb shell am compat disable OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION <package>
注意: 这些命令只会临时应用或移除覆盖。
OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED
启用兼容性策略,该策略在活动未为固定方向信箱化的情况下,会忽略应用程序响应应用程序调用 Activity#setRequestedOrientation()
在一秒钟内多次(超过两次)请求的方向。
应用如何实现与覆盖相同的效果
不适用。应在应用程序逻辑中解决该问题。
如何优化应用
如何禁用或选择退出覆盖
将属性标志 PROPERTY_COMPAT_ALLOW_IGNORING_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED
设置为 false
。
调整覆盖的属性标志
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_IGNORING_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED"
android:value="false"/>
用于测试覆盖的 adb 命令
要应用覆盖
adb shell am compat enable OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED <package>
要移除覆盖
adb shell am compat disable OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED <package>
注意: 这些命令只会临时应用或移除覆盖。
OVERRIDE_RESPECT_REQUESTED_ORIENTATION
将包从忽略方向请求行为中排除,该行为可以由设备制造商为显示区域或整个显示启用。
应用如何实现与覆盖相同的效果
不适用。应在应用程序逻辑中解决该问题。
如何优化应用
如何禁用或选择退出覆盖
没有选择退出。如果应用程序与启用了设备制造商忽略方向请求设置的设备不兼容,则禁用覆盖可能会很危险。请联系 Android 开发者关系 以禁用覆盖。
调整覆盖的属性标志
此覆盖没有属性标志。
用于测试覆盖的 adb 命令
要应用覆盖
adb shell am compat enable OVERRIDE_RESPECT_REQUESTED_ORIENTATION <package>
要移除覆盖
adb shell am compat disable OVERRIDE_RESPECT_REQUESTED_ORIENTATION <package>
注意: 这些命令只会临时应用或移除覆盖。
NEVER_SANDBOX_DISPLAY_APIS
强制包永远不会为信箱化或大小兼容模式活动应用 Display
API 沙盒化。 Display
API 继续提供显示区域边界。
应用如何实现与覆盖相同的效果
通过将 android:resizeableActivity
清单属性设置为 true
或将 android.supports_size_changes
元数据标志设置为 true
来声明活动可调整大小。
如何优化应用
声明完全可调整大小的应用程序永远不应依赖显示大小来定位 UI 元素。将您的应用程序迁移到提供 WindowMetrics
的最新 API。如果您使用的是 Jetpack Compose,请利用 WindowSizeClass
API 根据应用程序在当前显示屏上的屏幕区域大小来绘制 UI。请参阅 窗口大小类别。
如何禁用或选择退出覆盖
没有选择退出。从已弃用的 API 迁移。
调整覆盖的属性标志
此覆盖没有属性标志。
用于测试覆盖的 adb 命令
要应用覆盖
adb shell am compat enable NEVER_SANDBOX_DISPLAY_APIS <package>
要移除覆盖
adb shell am compat disable NEVER_SANDBOX_DISPLAY_APIS <package>
注意: 这些命令只会临时应用或移除覆盖。
ALWAYS_SANDBOX_DISPLAY_APIS
强制包始终应用 Display
API 沙盒化,无论窗口模式如何。 Display
API 始终提供应用程序边界。
应用如何实现与覆盖相同的效果
通过将 android:resizeableActivity
属性设置为 false
或将 android.supports_size_changes
元数据标志设置为 false
来声明活动不可调整大小。
如何优化应用
声明完全可调整大小的应用程序永远不应依赖显示大小来定位 UI 元素。将您的应用程序从已弃用的 API 迁移到提供 WindowMetrics
的最新 API。请参阅 WindowMetricsCalculator
。
如何禁用或选择退出覆盖
没有选择退出。从已弃用的 API 迁移。
调整覆盖的属性标志
此覆盖没有属性标志。
用于测试覆盖的 adb 命令
要应用覆盖
adb shell am compat enable ALWAYS_SANDBOX_DISPLAY_APIS <package>
要移除覆盖
adb shell am compat disable ALWAYS_SANDBOX_DISPLAY_APIS <package>
注意: 这些命令只会临时应用或移除覆盖。
OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS
强制包对以下 View
API 应用沙盒化,以限制活动边界
应用如何实现与覆盖相同的效果
通过使用提供应用程序窗口边界以及相对于应用程序窗口的偏移量(而不是设备显示的边界以及相对于设备显示的偏移量)的 API,在应用程序代码中解决该问题。
如何优化应用
应用程序应使用 View
API,同时考虑到将信箱化和多窗口模式应用于应用程序的可能性。请参阅 WindowMetricsCalculator
。
如何禁用或选择退出覆盖
将属性标志 PROPERTY_COMPAT_ALLOW_SANDBOXING_VIEW_BOUNDS_APIS
设置为 false
。
调整覆盖的属性标志
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_SANDBOXING_VIEW_BOUNDS_APIS"
android:value="false"/>
用于测试覆盖的 adb 命令
要应用覆盖
adb shell am compat enable OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS <package>
要移除覆盖
adb shell am compat disable OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS <package>
注意: 这些命令只会临时应用或移除覆盖。
OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION
禁用强制旋转。改善某些应用程序的用户体验。
应用如何实现与覆盖相同的效果
将属性标志 PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION
设置为 false
。
如何优化应用
不要依赖缓存的相机传感器方向或设备信息。有关相机兼容性指南,请参阅 Introducing Camera Viewfinder 和 Support resizable surfaces in your camera app。
如何禁用或选择退出覆盖
将属性标志 PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION
设置为 true
。
调整覆盖的属性标志
<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION"
android:value="true|false"/>
用于测试覆盖的 adb 命令
要应用覆盖(它会删除强制旋转)
adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION <package>
要删除覆盖(它会允许强制旋转发生)
adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION <package>
注意: 这些命令只会临时应用或移除覆盖。
OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH
禁用强制旋转后的活动刷新。改善刷新会导致应用程序状态丢失时的用户体验。
应用如何实现与覆盖相同的效果
将属性标志 PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH
设置为 false
。
如何优化应用
请参阅 OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION。
如何禁用或选择退出覆盖
将属性标志 PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH
设置为 true
。
调整覆盖的属性标志
<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH"
android:value="true|false"/>
用于测试覆盖的 adb 命令
要应用覆盖(它会删除活动刷新)
adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH <package>
要删除覆盖(它会允许活动刷新)
adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH <package>
注意: 这些命令只会临时应用或移除覆盖。
OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE
使应用了它的包使用 onResume()
→ onPause()
→ onResume()
循环而不是 onResume()
→ onStop()
→ onResume()
来执行相机兼容性强制旋转后的活动刷新。
应用如何实现与覆盖相同的效果
将属性标志 PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE
设置为 true
。
如何优化应用
请参阅 OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION。
如何禁用或选择退出覆盖
将属性标志 PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE
设置为 false
。
调整覆盖的属性标志
<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE"
android:value="true|false"/>
用于测试覆盖的 adb 命令
要应用覆盖
adb shell am compat enable OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE <package>
要移除覆盖
adb shell am compat disable OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE <package>
注意: 这些命令只会临时应用或移除覆盖。
OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT
强制相机输出裁剪到相反的方向,当纵向相机方向与设备的自然方向不一致时。许多应用程序无法处理这种情况,否则会显示拉伸的图像。
应用如何实现与覆盖相同的效果
将属性标志 PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT
设置为 true
。
如何优化应用
请参阅 OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION。
如何禁用或选择退出覆盖
将属性标志 PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT
设置为 false
。
调整覆盖的属性标志
<property android:name="android.camera.PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT"
android:value="true|false"/>
用于测试覆盖的 adb 命令
要应用覆盖(它会应用内部前置摄像头裁剪)
adb shell am compat enable OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT <package>
要删除覆盖(它会删除内部前置摄像头裁剪)
adb shell am compat disable OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT <package>
注意: 这些命令只会临时应用或移除覆盖。
OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION
阻止应用选择退出应用屏幕共享(参见 媒体投影)。当应用滥用 createConfigForDefaultDisplay()
API 强制全屏捕获并通过暴露通知内容来危及用户隐私时(通知内容在全屏捕获时会被捕获,但在应用屏幕共享时不会,并且所有应用无论窗口模式如何都会被捕获),就会实现该功能。
应用如何实现与覆盖相同的效果
允许默认媒体投影行为(在 Android 14,API 级别 34 中实现,使用 createScreenCaptureIntent()
),这使能用户决定无论窗口模式如何,是共享整个屏幕还是单个应用窗口。或者使用从调用 createConfigForUserChoice()
返回的 MediaProjectionConfig
参数调用 createScreenCaptureIntent(MediaProjectionConfig)
。
如何优化应用
允许用户在媒体投影期间选择是共享整个设备显示屏还是应用窗口,从 Android 14 开始,这是默认行为。
使您的应用可调整大小(resizeableActivity="true"
)以支持多窗口模式。
如何禁用或选择退出覆盖
由于用户隐私的重要性,您的应用不能禁用或选择退出此覆盖。
调整覆盖的属性标志
无。
用于测试覆盖的 adb 命令
要应用覆盖,它会取消应用对部分屏幕共享的选择退出(即启用部分屏幕共享)
adb shell am compat enable OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION <package>
要移除覆盖,它会允许应用选择退出部分屏幕共享
adb shell am compat disable OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION <package>
注意: 这些命令只会临时应用或移除覆盖。
OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS
使能发送用于分屏模式下未聚焦应用的假焦点。一些游戏引擎会在获取焦点之前等待绘制应用内容;因此,假焦点有助于应用避免在恢复且尚未获得焦点时保持黑屏。
应用如何实现与覆盖相同的效果
将属性标志 PROPERTY_COMPAT_ENABLE_FAKE_FOCUS
设置为 true
。
如何优化应用
如果您的应用能很好地处理多个方向和配置更改,您可以避免此问题。按照 大屏幕应用质量 指南使您的应用适应大屏幕。
如果您运行 Unity 游戏引擎,请升级到 2019.4.40 或更高版本,并重新导出您的游戏。在 Android Player 设置中保持 Resizable Window
选项选中。
如何禁用或选择退出覆盖
将属性标志 PROPERTY_COMPAT_ENABLE_FAKE_FOCUS
设置为 false
。
调整覆盖的属性标志
<property android:name="android.window.PROPERTY_COMPAT_ENABLE_FAKE_FOCUS"
android:value="true|false"/>
用于测试覆盖的 adb 命令
要应用覆盖
adb shell am compat enable OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS <package>
要移除覆盖
adb shell am compat disable OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS <package>
注意: 这些命令只会临时应用或移除覆盖。