Android中使用可下载字体

可下载字体简介

在Android 8.0(API level 26)和Android Support库26开始提供了从字体提供程序下载字体的API接口,用以替代将字体绑定打包到APK文件中,或者让APK下载字体文件。这个功能在Android 8.0(API level 26)及以上版本系统可用,或者在API level 14及以上的系统,通过26及以上版本的Support库实现。

可下载字体功能有一下好处

  • 降低APK文件大小
  • 提高应用安装成功率
  • 多个APK可以通过提供程序共享相同的字体,在需要的时候才从提供程序获取,这样可以改善系统生态的健康,节省用户移动设备的数据,内存以及硬盘存储空间。

更多相关内容可参考Google 官方文档

可下载字体如何实现?

    字体提供器是能将字体缓存到本地的应用,其他应用就可以请求和共享字体,大致的逻辑流程下图所示:
《Android中使用可下载字体》

可下载字体实现方法

可下载字体的实现方法有以下几种

  • 通过AndroidStudio和Google Play服务框架实现;
  • 通过代码编程实现;
  • 通过support支持库实现。

通过AndroidStudio和Google Play服务框架实现可下载字体

通过Android Studio 3.0及以上版本,可为应用配置下载字体。另外可使用Google Play服务框架的字体提供器,入门可下载字体功能。

注意:设备必须有11及以上版本的Google服务框架,才能使用Google字体提供器。

使用步骤如下:

  1. 打开布局文件,在布局编辑器(Layout Editor)中,切换为设计(Design)页面,点击选中需要设置字体的TextView控件,然后在属性(Attributes)窗口中,依次展开All Attributes>fontFamily>More Fonts,打开字体资源选择器
    《Android中使用可下载字体》
  2. 在选择器页面的Source选择Google Fonts
    《Android中使用可下载字体》
  3. 在选择对应的字体(选择Downloadable Fonts中的字体),选择字体样式,点击“OK”按钮即可。

Android Studio会自动生成需要渲染的字体描述XML文件,并添加应用中。
《Android中使用可下载字体》
4. 预览字体文件

通过编程实现可下载字体功能

    从Android 8.0(API level 26)开始,系统直接支持可下载字体,但是在之前的版本,则需要使用26.0及以上版本的支持库来实现。

    编程方式实现可下载字体功能,你需要掌握两个关键的类

  • android.graphics.fonts.FontRequest:这个类可以创建一个字体请求
  • android.provider.FontsContract:这个类可以可以基于字体请求创建一个字体样式(Typeface)对象

    你的应用通过FontsContractAPI从提供器中索引字体。每个字体提供程序对Android版本和支持的语言都有一套自己的限制,详情需要参考字体提供程序的相关文档。

下载字体,按一下步骤实现:

  1. 创建一个android.graphics.fonts.FontRequest类的对象,用来想提供程序请求字体。创建一个请求,需要传入以下参数:
  • 字体提供程序的认证
  • 用来区分提供程序的字体提供程序包名
  • 字体查询索引
  • 用以验证提供程序身份的证书哈希值列表

示例:

val fontRequest = FontRequest(
    "com.google.android.gms.fonts",
    "com.google.android.gms",
    "Aclonica",
    R.array.com_google_android_gms_fonts_certs)

证书哈希值列表在XML资源中定义

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <array name="com_google_android_gms_fonts_certs">
        <item>@array/com_google_android_gms_fonts_certs_dev</item>
        <item>@array/com_google_android_gms_fonts_certs_prod</item>
    </array>
    <string-array name="com_google_android_gms_fonts_certs_dev">
        <item>
            MIIEqDCCA5CgAwIBAgIJANWFuGx90071MA0GCSqGSIb3DQEBBAUAMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTAeFw0wODA0MTUyMzM2NTZaFw0zNTA5MDEyMzM2NTZaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBANbOLggKv+IxTdGNs8/TGFy0PTP6DHThvbbR24kT9ixcOd9W+EaBPWW+wPPKQmsHxajtWjmQwWfna8mZuSeJS48LIgAZlKkpFeVyxW0qMBujb8X8ETrWy550NaFtI6t9+u7hZeTfHwqNvacKhp1RbE6dBRGWynwMVX8XW8N1+UjFaq6GCJukT4qmpN2afb8sCjUigq0GuMwYXrFVee74bQgLHWGJwPmvmLHC69EH6kWr22ijx4OKXlSIx2xT1AsSHee70w5iDBiK4aph27yH3TxkXy9V89TDdexAcKk/cVHYNnDBapcavl7y0RiQ4biu8ymM8Ga/nmzhRKya6G0cGw8CAQOjgfwwgfkwHQYDVR0OBBYEFI0cxb6VTEM8YYY6FbBMvAPyT+CyMIHJBgNVHSMEgcEwgb6AFI0cxb6VTEM8YYY6FbBMvAPyT+CyoYGapIGXMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbYIJANWFuGx90071MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEEBQADggEBABnTDPEF+3iSP0wNfdIjIz1AlnrPzgAIHVvXxunW7SBrDhEglQZBbKJEk5kT0mtKoOD1JMrSu1xuTKEBahWRbqHsXclaXjoBADb0kkjVEJu/Lh5hgYZnOjvlba8Ld7HCKePCVePoTJBdI4fvugnL8TsgK05aIskyY0hKI9L8KfqfGTl1lzOv2KoWD0KWwtAWPoGChZxmQ+nBli+gwYMzM1vAkP+aayLe0a1EQimlOalO762r0GXO0ks+UeXde2Z4e+8S/pf7pITEI/tP+MxJTALw9QUWEv9lKTk+jkbqxbsh8nfBUapfKqYn0eidpwq2AzVp3juYl7//fKnaPhJD9gs=
        </item>
    </string-array>
    <string-array name="com_google_android_gms_fonts_certs_prod">
        <item>
            MIIEQzCCAyugAwIBAgIJAMLgh0ZkSjCNMA0GCSqGSIb3DQEBBAUAMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDAeFw0wODA4MjEyMzEzMzRaFw0zNjAxMDcyMzEzMzRaMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBAKtWLgDYO6IIrgqWbxJOKdoR8qtW0I9Y4sypEwPpt1TTcvZApxsdyxMJZ2JORland2qSGT2y5b+3JKkedxiLDmpHpDsz2WCbdxgxRczfey5YZnTJ4VZbH0xqWVW/8lGmPav5xVwnIiJS6HXk+BVKZF+JcWjAsb/GEuq/eFdpuzSqeYTcfi6idkyugwfYwXFU1+5fZKUaRKYCwkkFQVfcAs1fXA5V+++FGfvjJ/CxURaSxaBvGdGDhfXE28LWuT9ozCl5xw4Yq5OGazvV24mZVSoOO0yZ31j7kYvtwYK6NeADwbSxDdJEqO4k//0zOHKrUiGYXtqw/A0LFFtqoZKFjnkCAQOjgdkwgdYwHQYDVR0OBBYEFMd9jMIhF1Ylmn/Tgt9r45jk14alMIGmBgNVHSMEgZ4wgZuAFMd9jMIhF1Ylmn/Tgt9r45jk14aloXikdjB0MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEUMBIGA1UEChMLR29vZ2xlIEluYy4xEDAOBgNVBAsTB0FuZHJvaWQxEDAOBgNVBAMTB0FuZHJvaWSCCQDC4IdGZEowjTAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBAUAA4IBAQBt0lLO74UwLDYKqs6Tm8/yzKkEu116FmH4rkaymUIE0P9KaMftGlMexFlaYjzmB2OxZyl6euNXEsQH8gjwyxCUKRJNexBiGcCEyj6z+a1fuHHvkiaai+KL8W1EyNmgjmyy8AW7P+LLlkR+ho5zEHatRbM/YAnqGcFh5iZBqpknHf1SKMXFh4dd239FJ1jWYfbMDMy3NS5CTMQ2XFI1MvcyUTdZPErjQfTbQe3aDQsQcafEQPD+nqActifKZ0Np0IS9L9kR/wbNvyz6ENwPiTrjV2KRkEjH78ZMcUQXg0L3BYHJ3lc69Vs5Ddf9uUGGMYldX3WfMBEmh/9iFBDAaTCK
        </item>
    </string-array>
</resources>

注意:如果您从系统预安装的提供程序中请求字体,则无需添加证书。但是,如果通过支持库请求字体,则必须提供证书。

  1. 创建FontsContract.FontRequestCallback类的实例

  2. 覆盖 onTypefaceRetrieved()方法 :这是字体请求已完成的回调方法,检索到的字体作为回调参数,您可以根据需要在此方法设置字体。例如,您可以在TextView设置字体样式

  3. 重写 onTypefaceRequestFailed() 方法:这字体请求过程中出现错误的回调方法。有关错误代码的更多信息,请参阅 error code constants

  4. 调用FontsContract.requestFont()方法重字体提供程序中获取字体内容。这个方法将检查字体是否存在缓存中,如果字体不在本地缓存,将会从字体提供程序中异步下载字体。调用该方法传入以下参数:

  • Context类对象
  • android.graphics.fonts.FontRequest类对象
  • 用户监听请求结果的回调(FontsContract.FontRequestCallback对象)
  • 字体下载线程的处理程序(Handler对象)

代码示例:

val fontRequest = FontRequest(
    "com.google.android.gms.fonts",
    "com.google.android.gms",
    "Aclonica",
    R.array.com_google_android_gms_fonts_certs)


val requestCallbacks = object : FontsContract.FontRequestCallback() { 

    override fun  onTypefaceRetrieved(typeface: Typeface) { 
        Log.e("AAAAAA", "onTypefaceRetrieved: ${ typeface.toString()}")
        typeFace = typeface
        FontRequestManager.instance.onTypefaceRetrieved("Aclonica", typeface)
    }

    override fun onTypefaceRequestFailed(reason: Int) { 
        Log.e("AAAAAA", "onTypefaceRequestFailed: ${ reason}")
    }
}

FontsContract.requestFont(this, fontRequest, requestCallbacks, mHandler)

通过支持库使用可下载字体

     26及以上版本的支持库,为运行Android API版本低于26且大于14的设备上提供可下载字体的功能的支持。android.support.v4.provider包名下包含了相关的类,支持库中相关的类跟系统框架中的类似,下载字体的流程也跟前面提到的系统框架下载字体类似。

支持库与系统框架类对应关系

系统框架中的类支持库中的类备注
android.provider.FontRequestandroidx.core.provider.FontRequest
android.provider.FontsContractandroidx.core.provider.FontsContractCompat

使用支持库实现可下载字体的功能,也就是使用支持库中的androidx.core.provider(或者是android.support.v4.provider)包下的类替换系统框架中的android.provider包下的类。

注意:通过支持库实现可下载字体功能,即使字体提供程序是系统预安装的,在你请求字体的时候,必须提供证书。

在项目中添加依赖库的支持

在项目中添加com.android.support:support-compat的依赖(如果targetSDKVersion是28及以上,可以使用androidx.core:core依赖)

通过XML资源来定义使用可下载字体

在Android 8.0 (API level 26)及26的支持库开始,提供了一种更有效方法声明自定义的字体,那就是通过XML资源文件。这就意味着不在需要将字体打包到程序的asset资源中,如果字体支持支持,还可以轻松设置自定义字体的主题样式,比如:字体粗细。

  1. res/font目录下创建XML文件
  2. 在XML文件中添加<font-family>根节点,跟字体相关的属性如下示例XML文件所示:
<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:app="http://schemas.android.com/apk/res-auto" app:fontProviderAuthority="com.google.android.gms.fonts" app:fontProviderCerts="@array/com_google_android_gms_fonts_certs" app:fontProviderPackage="com.google.android.gms" app:fontProviderQuery="Aclonica">
</font-family>
  1. 通过@font/xml_font_file_name的方式引用字体文件,可以在XML布局文件中直接引用,也可以在代码中使用getFont()方法获取字体文件。

AndroidManifest.xml中预声明字体

在布局中关联字体和检索下载是异步任务。第一次尝试检索字体会默认请求字体提供程序,因此会增加第一次布局加载时间,为避免延迟,你可以在AndroidManifest.xml预声明需要检索的字体。在系统从提供程序中获取到字体后,将会立即可用。如果字体获取使用的事件超过了期望,系统将会中断获取进程,并使用默认的字体。

在清单中预声明字体的步骤如下:

  1. 在资源目录res/values下创建一个数组资源xml文件,,并在里面列出需要预定义的字体
    示例:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <array name="preloaded_fonts" translatable="false">
        <item>@font/aclonica</item>
        <item>@font/alex_brush</item>
        <item>@font/bilbo_swash_caps</item>
    </array>
</resources>
  1. AndroidManifest.xml中使用meta-data标签声明预定义的字体数组
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- .... -->
    <application>
        <!-- .... -->
        <meta-data android:name="preloaded_fonts" android:resource="@array/preloaded_fonts" />
    </application>

</manifest>

添加证书

如果字体提供程序不是预安装,或者如果你使用支持库实现,那么你就必须声明字体提供程序验证使用的签名证书,系统使用该证书校验字体提供程序的身份。

注意:如果你使用Android Studio的字体选择工具选择Google Play服务框架提供程序中的字体,Android Studio会自动配置证书。

添加证书的步骤如下:

  1. 创建一个包含证书详细内容的字符数组资源
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="com_google_android_gms_fonts_certs_prod">
        <item>
            MIIEQzCCAyugAwIBAgIJAMLgh0ZkSjCNMA0GCSqGSIb3DQEBBAUAMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDAeFw0wODA4MjEyMzEzMzRaFw0zNjAxMDcyMzEzMzRaMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBAKtWLgDYO6IIrgqWbxJOKdoR8qtW0I9Y4sypEwPpt1TTcvZApxsdyxMJZ2JORland2qSGT2y5b+3JKkedxiLDmpHpDsz2WCbdxgxRczfey5YZnTJ4VZbH0xqWVW/8lGmPav5xVwnIiJS6HXk+BVKZF+JcWjAsb/GEuq/eFdpuzSqeYTcfi6idkyugwfYwXFU1+5fZKUaRKYCwkkFQVfcAs1fXA5V+++FGfvjJ/CxURaSxaBvGdGDhfXE28LWuT9ozCl5xw4Yq5OGazvV24mZVSoOO0yZ31j7kYvtwYK6NeADwbSxDdJEqO4k//0zOHKrUiGYXtqw/A0LFFtqoZKFjnkCAQOjgdkwgdYwHQYDVR0OBBYEFMd9jMIhF1Ylmn/Tgt9r45jk14alMIGmBgNVHSMEgZ4wgZuAFMd9jMIhF1Ylmn/Tgt9r45jk14aloXikdjB0MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEUMBIGA1UEChMLR29vZ2xlIEluYy4xEDAOBgNVBAsTB0FuZHJvaWQxEDAOBgNVBAMTB0FuZHJvaWSCCQDC4IdGZEowjTAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBAUAA4IBAQBt0lLO74UwLDYKqs6Tm8/yzKkEu116FmH4rkaymUIE0P9KaMftGlMexFlaYjzmB2OxZyl6euNXEsQH8gjwyxCUKRJNexBiGcCEyj6z+a1fuHHvkiaai+KL8W1EyNmgjmyy8AW7P+LLlkR+ho5zEHatRbM/YAnqGcFh5iZBqpknHf1SKMXFh4dd239FJ1jWYfbMDMy3NS5CTMQ2XFI1MvcyUTdZPErjQfTbQe3aDQsQcafEQPD+nqActifKZ0Np0IS9L9kR/wbNvyz6ENwPiTrjV2KRkEjH78ZMcUQXg0L3BYHJ3lc69Vs5Ddf9uUGGMYldX3WfMBEmh/9iFBDAaTCK
        </item>
    </string-array>
</resources>
  1. 在字体配置文件中的fontProviderCerts节点配置证书
<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:app="http://schemas.android.com/apk/res-auto" app:fontProviderAuthority="com.google.android.gms.fonts" app:fontProviderPackage="com.google.android.gms" app:fontProviderQuery="Alex Brush" app:fontProviderCerts="@array/com_google_android_gms_fonts_certs_prod">
</font-family>

说明:如果提供程序包含多个证书,可以定义一个数组,数组的元素就是包含证书的字符数组

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <array name="com_google_android_gms_fonts_certs">
       <item>@array/com_google_android_gms_fonts_certs_dev</item>
       <item>@array/com_google_android_gms_fonts_certs_prod</item>
   </array>
   <string-array name="com_google_android_gms_fonts_certs_dev">
       <item> MIIEqDCCA5CgAwIBAgIJANWFuGx90071MA0GCSqGSIb3DQEBBAUAMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTAeFw0wODA0MTUyMzM2NTZaFw0zNTA5MDEyMzM2NTZaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBANbOLggKv+IxTdGNs8/TGFy0PTP6DHThvbbR24kT9ixcOd9W+EaBPWW+wPPKQmsHxajtWjmQwWfna8mZuSeJS48LIgAZlKkpFeVyxW0qMBujb8X8ETrWy550NaFtI6t9+u7hZeTfHwqNvacKhp1RbE6dBRGWynwMVX8XW8N1+UjFaq6GCJukT4qmpN2afb8sCjUigq0GuMwYXrFVee74bQgLHWGJwPmvmLHC69EH6kWr22ijx4OKXlSIx2xT1AsSHee70w5iDBiK4aph27yH3TxkXy9V89TDdexAcKk/cVHYNnDBapcavl7y0RiQ4biu8ymM8Ga/nmzhRKya6G0cGw8CAQOjgfwwgfkwHQYDVR0OBBYEFI0cxb6VTEM8YYY6FbBMvAPyT+CyMIHJBgNVHSMEgcEwgb6AFI0cxb6VTEM8YYY6FbBMvAPyT+CyoYGapIGXMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbYIJANWFuGx90071MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEEBQADggEBABnTDPEF+3iSP0wNfdIjIz1AlnrPzgAIHVvXxunW7SBrDhEglQZBbKJEk5kT0mtKoOD1JMrSu1xuTKEBahWRbqHsXclaXjoBADb0kkjVEJu/Lh5hgYZnOjvlba8Ld7HCKePCVePoTJBdI4fvugnL8TsgK05aIskyY0hKI9L8KfqfGTl1lzOv2KoWD0KWwtAWPoGChZxmQ+nBli+gwYMzM1vAkP+aayLe0a1EQimlOalO762r0GXO0ks+UeXde2Z4e+8S/pf7pITEI/tP+MxJTALw9QUWEv9lKTk+jkbqxbsh8nfBUapfKqYn0eidpwq2AzVp3juYl7//fKnaPhJD9gs=
       </item>
   </string-array>
   <string-array name="com_google_android_gms_fonts_certs_prod">
       <item>
           MIIEQzCCAyugAwIBAgIJAMLgh0ZkSjCNMA0GCSqGSIb3DQEBBAUAMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDAeFw0wODA4MjEyMzEzMzRaFw0zNjAxMDcyMzEzMzRaMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBAKtWLgDYO6IIrgqWbxJOKdoR8qtW0I9Y4sypEwPpt1TTcvZApxsdyxMJZ2JORland2qSGT2y5b+3JKkedxiLDmpHpDsz2WCbdxgxRczfey5YZnTJ4VZbH0xqWVW/8lGmPav5xVwnIiJS6HXk+BVKZF+JcWjAsb/GEuq/eFdpuzSqeYTcfi6idkyugwfYwXFU1+5fZKUaRKYCwkkFQVfcAs1fXA5V+++FGfvjJ/CxURaSxaBvGdGDhfXE28LWuT9ozCl5xw4Yq5OGazvV24mZVSoOO0yZ31j7kYvtwYK6NeADwbSxDdJEqO4k//0zOHKrUiGYXtqw/A0LFFtqoZKFjnkCAQOjgdkwgdYwHQYDVR0OBBYEFMd9jMIhF1Ylmn/Tgt9r45jk14alMIGmBgNVHSMEgZ4wgZuAFMd9jMIhF1Ylmn/Tgt9r45jk14aloXikdjB0MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEUMBIGA1UEChMLR29vZ2xlIEluYy4xEDAOBgNVBAsTB0FuZHJvaWQxEDAOBgNVBAMTB0FuZHJvaWSCCQDC4IdGZEowjTAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBAUAA4IBAQBt0lLO74UwLDYKqs6Tm8/yzKkEu116FmH4rkaymUIE0P9KaMftGlMexFlaYjzmB2OxZyl6euNXEsQH8gjwyxCUKRJNexBiGcCEyj6z+a1fuHHvkiaai+KL8W1EyNmgjmyy8AW7P+LLlkR+ho5zEHatRbM/YAnqGcFh5iZBqpknHf1SKMXFh4dd239FJ1jWYfbMDMy3NS5CTMQ2XFI1MvcyUTdZPErjQfTbQe3aDQsQcafEQPD+nqActifKZ0Np0IS9L9kR/wbNvyz6ENwPiTrjV2KRkEjH78ZMcUQXg0L3BYHJ3lc69Vs5Ddf9uUGGMYldX3WfMBEmh/9iFBDAaTCK
       </item>
   </string-array>
</resources>

经验总结

    可下载字体是一个很好的策略,但是由于国内手机厂商比较多,没有一个统一的Android手机生态(众所周知的原因,Google Play服务国内无法使用),所以必须自己搭建一套字体提供程序,这样一来也是相当繁琐的。这个功能也是从Android 8.0(API 26)才开始提出(但可以通过支持库在Android 4.0(API 14)及以上版本使用),如果有兴趣的同学,还可以学些搭建自己的字体提供程序。

    原文作者:精装机械师
    原文地址: https://blog.csdn.net/yingaizhu/article/details/104532897
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞