0

我正在构建一个基于 Android 的 WebView 类的 webapp。目前,当我将它指向我的页面时,任何日文字符都会使用我想要的 DroidSansFallback 字体呈现。但是,当设备的语言更改为日语时,它会开始以 MTLmr3m.ttf 字体呈现日语字符,这有时会影响正在加载的网页的布局。经过一番研究,我发现这是由于 fallback_fonts.xml 系统文件中的这段代码

<family>
    <fileset>
        <file lang="ja">MTLmr3m.ttf</file>
    </fileset>
</family>

大概我无法更改此系统文件,但是有没有办法可以直接引用 DroidSansFallback.ttf 文件并将字体设置为当字符串包含日文字符时,这样无论设备设置的语言如何,都可以使用此字体至?

我尝试使用shouldInterceptRequest()WebViewClient 类在 css @font-face 声明中捕获一个虚拟协议,如下所示:src: url("font:Droid") format("truetype");并通过以下代码以这种方式发送字体:

...
if (url.equals("font:Droid")){  
    File font = new File(Environment.getRootDirectory(),"/fonts/DroidSansFallback.ttf");
    InputStream is = new FileInputStream(font);
    String encoding="UTF-8";
    WebResourceResponse font = new WebResourceResponse("font/ttf",encoding,is);
    return font;
}
...

该方法捕获请求,但未按预期返回 WebResourceResponse。

我希望也许有一个解决方案,我可以以某种方式在 CSS 中引用我想要的字体。有什么建议么?

4

1 回答 1

0

我知道这肯定迟到了,但可能对某人有用。

1)除非你有Root权限,否则你不能访问android根目录“ / ”。
2)我相信你使用了错误的 mimetype 字体,使用这个“ application/x-font-ttf

所以您有 2 个选项,将您想要的字体放入资产中,或将您的字体复制到外部存储。
我将展示第一种方式,将另一种方式留给你。

@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url)
{
    if(url.contains("font/droid.ttf"))
    {
         return getFontFromAsset();
    }
}

private WebResourceResponse getFontFromAsset()
{       
    InputStream fontIn = null;
    try 
    {
        fontIn = yourContext.getAssets().open("DroidSansFallback.ttf");         
    } 
    catch (IOException e) 
    {
        e.printStackTrace();
    }
    if(fontIn == null)
        return null;
    else
    {           
        WebResourceResponse response = new WebResourceResponse("application/x-font-ttf", "UTF-8", fontIn);
        return response;
    }       
}

你也可以为你的CSS使用这样的东西:

@font-face { font-family: 'droid'; src: url('font/droid.ttf');} body { font-family: 'droid';}

这是我的工作方法。

于 2014-08-20T03:58:55.137 回答