Как установить 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));
}
}