Skip to content

小米 HyperOS Android 14/15 适配坑点

EditText 高度异常

这个问题在 targetApi35,运行在 HyperOS2 Android15 时会出现,表现为高度偏大,文本在中间偏上位置,如图:

image-20250827101222717

xml
		<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 添加这两行代码,关闭这个行为,因为中文并不涉及这两个特性,所以关闭没有影响:

xml
        android:elegantTextHeight="false"
        android:useLocalePreferredLineHeightForMinimum="false"

可以配置全局关闭:

res/values/styles.xml 添加如下:

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 添加如下:

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,也就不会有文本排版优化。

参考:

  1. https://github.com/facebook/react-native/issues/15114#issuecomment-2422537975
  2. 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 33N/A
由应用控制
SDK 34由系统控制(兼容行为)
由应用控制

但在测试过程中会发现,targetApi 为 33 的应用,在仅声明 READ_MEDIA_IMAGES、READ_MEDIA_VIDEO、READ_MEDIA_AUDIO 权限,未声明 READ_MEDIA_VISUAL_USER_SELECTED 的情况下(也就是对应表格第一行的情况),运行在小米的安卓 14 或者 15 还是会有选择部分的选项。

1756262590512

查找小米安卓 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 权限,都会允许部分选择。所以为了正常运行,只能提前适配这个特性,或者针对小米机型做一些特判。

上次更新于: