Как установить FontFamily для WebView с загружаемыми шрифтами?

В настоящее время я реорганизовал свое приложение для использования загружаемых шрифтов, поэтому у меня нет файлов ресурсов для шрифтов. Я много искал, и единственное решение, которое я вижу, это установить FontFamily в файле CSS и указать папку src для ресурсов. Это невозможно с загружаемыми шрифтами.

0 ответов

При использовании загружаемого шрифта Android вы можете получить URI файла шрифта ttf из метода FontInfo.getUri().

FontsContractCompat.FontFamilyResult fontFamilyResult = FontsContractCompat.fetchFonts(view.getContext(), null, fontRequest);
Uri fontUri = fontFamilyResult.getFonts()[0].getUri();

Вы можете использовать этот URI для кеширования ttf-файла в пространстве вашего приложения, на который вы можете напрямую ссылаться в WebView HTML и других местах.

Если вместо этого вы хотите использовать модель URI, обратите внимание, что вы не можете напрямую использовать URI, возвращаемый FontsContractCompat, потому что это может нарушить политику CORS из-за разных базовых доменов загруженного контента и этого URI. Вы можете использовать настраиваемый шаблон URI в HTML WebView и перехватить этот запрос в методе shouldInterceptRequest WebViewClient, где вы можете вернуть InputStream (завернутый как WebResourceResponse) из URI, возвращенного запросом FontsContractCompat или локально кэшированным файлом шрифта.

сформируйте URI в css следующим образом (требуется установить myappscheme://com.myapp.demo как базовый URL-адрес вашего контента)

@font-face {
  font-family: Roboto;
  src: url('myappscheme://com.myapp.demo/fonts/name=Roboto');
}

и в WebViewClient. это просто демонстрационный фрагмент кода. так что добавьте здесь некоторую обработку ошибок

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
    @Override
    public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request)
    {
        Uri requestUri = request.getUrl();
        if (requestUri.getScheme()
                      .equals("myappscheme") && requestUri.getPath()
                                                          .startsWith("fonts"))
        {
            Context context = view.getContext();
            File fontFile = new File(context.getExternalCacheDir(), requestUri.getQueryParameter("name") + ".ttf");
            if (!fontFile.exists())
            {
                FontRequest fontRequest = new FontRequest(
                    "com.google.android.gms.fonts",
                    "com.google.android.gms",
                    requestUri.getQuery(),
                    R.array.com_google_android_gms_fonts_certs);

                FontsContractCompat.FontFamilyResult fontFamilyResult = FontsContractCompat.fetchFonts(view.getContext(), null, fontRequest);
                if (fontFamilyResult.getStatusCode() == FontsContractCompat.FontFamilyResult.STATUS_OK)
                {
                    InputStream gFont = context.getContentResolver()
                                               .openInputStream(fontFamilyResult.getFonts()[0].getUri());
                    fontFile.createNewFile();
                    ByteStreamsKt.copyTo(gFont, new FileOutputStream(fontFile), 4096);
                }
            }
            return new WebResourceResponse("application/octet-stream", null, new FileInputStream(fontFile));
        }
    }
Другие вопросы по тегам