通过CSS访问特定的Android系统字体

时间:2013-11-07 01:24:05

标签: android css web-applications fonts webview

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

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

据推测我无法更改此系统文件,但有一种方法可以直接引用DroidSansFallback.ttf文件并将字体设置为当字符串具有日语字符时的字体,以便使用此字体而不管语言是什么设备设置为?

我尝试使用WebViewClient类中的shouldInterceptRequest()来捕获css @ font-face delcaration中的伪协议,如下所示: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中我想要的字体。有什么建议吗?

1 个答案:

答案 0 :(得分: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';}

这是我的工作方法。