小米 HyperOS Android 14/15 适配坑点
EditText 高度异常
这个问题在 targetApi35,运行在 HyperOS2 Android15 时会出现,表现为高度偏大,文本在中间偏上位置,如图:
<EditText
android:id="@+id/t1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="异常案例"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/t2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:elegantTextHeight="false"
android:text="正常案例"
android:useLocalePreferredLineHeightForMinimum="false"
app:layout_constraintStart_toEndOf="@id/t1"
app:layout_constraintTop_toTopOf="parent" />
关于这个改动,谷歌的文档在这,但是小米把这个特性改坏了,在使用默认的 MiSans 字体时会出现。解决方法就是给 EditText 添加这两行代码,关闭这个行为,因为中文并不涉及这两个特性,所以关闭没有影响:
android:elegantTextHeight="false"
android:useLocalePreferredLineHeightForMinimum="false"
可以配置全局关闭:
res/values/styles.xml 添加如下:
<style name="Widget.App.TextView" parent="Widget.AppCompat.TextView">
<item name="android:elegantTextHeight">false</item>
<item name="android:useLocalePreferredLineHeightForMinimum">false</item>
</style>
<style name="Widget.App.EditText" parent="Widget.AppCompat.EditText">
<item name="android:elegantTextHeight">false</item>
<item name="android:useLocalePreferredLineHeightForMinimum">false</item>
</style>
res/values/themes.xml 添加如下:
<item name="android:textViewStyle">@style/Widget.App.TextView</item>
<item name="editTextStyle">@style/Widget.App.EditText</item>
<item name="android:editTextStyle">@style/Widget.App.EditText</item>
这个问题在 React Native 同样会出现,我的解释在这
Text 文本末尾异常裁切
这个问题原本是 RN 的 Text 组件在安卓上的宽度测量问题,但小米 HyperOS2 Android15 在字体样式里加了一个“文本排版优化”功能(MiSans 字体才能用),默认开启,开启时会调大中文和英文、数字之间的间距,让这个问题变得更严重了。另外,原生安卓开发的 App 部分情况下也会有此问题。
解决方法是设置默认字体为 Roboto,App 内自带这个字体。这个字体不含中文字符,这样只会影响英文和数字。同时因为指定了不使用 MiSans,也就不会有文本排版优化。
参考:
- https://github.com/facebook/react-native/issues/15114#issuecomment-2422537975
- https://blog.csdn.net/qq_32671919/article/details/145342109
照片和视频的部分访问权限
这个特性是谷歌在安卓 14 引入的,文档
文档中关于这个特性的描述如下:
Android 14 引入了所选照片访问权限,可让用户授予应用对其库中特定图片和视频的访问权限,而不是授予对给定类型的所有媒体内容的访问权限。
借助 Android 14 中的“所选照片访问权限”功能,您的应用应采用新的
READ_MEDIA_VISUAL_USER_SELECTED
权限来控制媒体重新选择,并更新应用界面,以便用户向您的应用授予对一组不同图片和视频的访问权限。
targetSdkVersion | 是否声明READ_MEDIA_VISUAL_USER_SELECTED 权限 | 是否允许选择部分图片 | 用户体验行为 |
---|---|---|---|
SDK 33 | 否 | 否 | N/A |
是 | 是 | 由应用控制 | |
SDK 34 | 否 | 是 | 由系统控制(兼容行为) |
是 | 是 | 由应用控制 |
但在测试过程中会发现,targetApi 为 33 的应用,在仅声明 READ_MEDIA_IMAGES、READ_MEDIA_VIDEO、READ_MEDIA_AUDIO 权限,未声明 READ_MEDIA_VISUAL_USER_SELECTED 的情况下(也就是对应表格第一行的情况),运行在小米的安卓 14 或者 15 还是会有选择部分的选项。
查找小米安卓 14 适配文档,描述如下:
1.7 授权访问部分照片或视频
当 Android 14 上的应用程序请求在 Android 13(API 级别 33)引入的权限 READ_MEDIA_IMAGES 或 READ_MEDIA_VIDEO 时,可以选择授权部分访问权限。 注意:targetSDK≥33,Android 14 上的应用都会受到此更改的影响。
也就是说,在小米的安卓 14 上,只要 targetApi>=33,不论是否声明 READ_MEDIA_VISUAL_USER_SELECTED 权限,都会允许部分选择。所以为了正常运行,只能提前适配这个特性,或者针对小米机型做一些特判。