1、前言
在14年的時候寫過一篇博客關於ArcGIS for Android 10.1.1API 中文標注導致程序異常崩潰問題,但是當時並沒有很好的解決這樣一個問題,也並沒有深入研究分析這樣的一個異常的產生原因,或者中文標注亂碼、不顯示、異常顯示是什么原因造成的。而是使用了一種折中的解決方案:對於要使用TextSymbol的情況,先將文本信息轉化成為圖片,然后利用PictureSymbol顯示。這樣雖然能夠避免異常的產生,但是總覺得現有的解決方案並非正解。加上群里的朋友也剛好研究到了這一塊,並提供了對應的解決方案,只要在顯示文本信息時,設置字體即可。
核心代碼如下所示:
TextSymbol ts = new TextSymbol(18, "中文標注顯示測試,English Test", Color.RED);
ts.setFontFamily("DroidSansFallback.ttf");//設置字體
ts.setOffsetX(0);
ts.setOffsetY(-30);
Graphic gText = new Graphic(point,ts);
graphicsLayer.addGraphic(gText);
但是在筆者的機器上運行了一下就產生了如下的效果。(LG Nexus 4 ,Android版本5.0.1 原生系統)

於是換了個設備並作測試,然后奇跡的發現顯示又是正常的。(三星GT-P7510,Android版本4.1.2 CM版)

轉載請注明出處:http://www.cnblogs.com/gis-luq/p/4833361.html
2、問題產生原因
針對上面的問題是如何產生的呢?通過查閱資料我在網上看到以下這樣一段話。
Android系統中一般中英文字體包,主要是DroidSansFallback.ttf(中文字體)、DroidSans.ttf(英文字體)、 DroidSans-Bold.ttf(英文加粗字體)這三種,因為這三種字體是Andorid系統中幾乎每一個顯示界面都要使用到的字體,是默認的系統字體,所以只要你是Android手機,一般系統就內置有這三款字體。
但是估計也有例外,因為對於定制的Android系統有沒有這個字體,這個字體是不是默認的就真的不好說了,比如MIUI。還有就是我們測試時候采用原生Android 5.01系統的Nexus4顯示也是異常的,那這又是為什么? 這里我嘗試打開Android Device Monitor工具並檢查字體。

在Android Device Monitor工具下找到File Explorer,字體庫的位置是在:/system/fonts文件夾下。
通過仔細檢查,發現Android 5.01系統的Nexus4的字體庫中並沒有DroidSansFallback.ttf字體文件,然后我又用同樣的方式查看了三星GT-P7510,Android版本4.1.2系統的字體庫,在字體庫里我們如期發現了DroidSansFallback.ttf字體,到這里也就能夠解釋,為什么在Nexus4中字體顯示異常,在GT-P7510顯示正常的原因。

網上有很多教大家替換Android字體的文章,在這些文章里我們發現這樣一個問題:Android 5.0系統默認的簡體中文字體替換為了NotoSansHans-Regular.otf,通過上面的檢查我們也知道了Android 5.01的系統里沒有DroidSansFallback.ttf字體。我想這樣就是問題的關鍵點所在了。
接下來我們做進一步的測試,將字體替換為NotoSansHans-Regular.otf。然后示例代碼如下:
TextSymbol ts = new TextSymbol(18, "中文標注顯示測試,English Test", Color.RED);
ts.setFontFamily("NotoSansHans-Regular.otf");
ts.setOffsetX(0);
ts.setOffsetY(-30);
Graphic gText = new Graphic(point,ts);
graphicsLayer.addGraphic(gText);
結果在Nexus4 上依舊中文顯示亂碼,有可能是otf的字體文件就沒有被識別到。
為了讓字體顯示正常。我又做了以下操作,先把Nexus4給Root了,然后將DroidSansFallback.ttf字體文件拷貝到手機系統字體文件夾下(/system/fonts),最后終於是成功了。結果如下圖:

3、問題處理方案
其實在剖析產生原因的時候已經介紹了處理方案,這里簡單的再總結下。
1)、Android 5.0以下版本,檢查手機字體庫內是否包含DroidSansFallback.ttf字體,若包含則在使用TextSymbol時設置使用的字體。(設置其他字體也是可以的,但是該字體要支持中文)
2)、Android 5.0以上版本,由於默認的otf格式字體不被識別,所以先將DroidSansFallback.ttf字體文件拷貝到手機系統字體文件夾下,然后設置使用。(對於用到的手機每個都Root並設置也不是很現實)
3)、對於網上提到的加載自定義本地字體解決方案,關鍵代碼如下所示,其中字體類是Typeface,我並沒有在TextSymbol中找到對應的設置接口,所以這條路暫時也沒有走通。歡迎大家拍磚補充。
Typeface customFont = Typeface.createFromAsset(this.getAssets(), "fonts/YourCustomFont.ttf"); TextView view = (TextView) findViewById(R.id.activity_main_header); view.setTypeface(customFont);
其他說明:ArcGIS Runtime SDK for Android 版本為10.2.6-u2
4、參考資料
http://www.68idc.cn/help/buildlang/ask/20150102153583.html
http://www.zhihu.com/question/26202765
http://jingyan.baidu.com/article/8275fc86b80c6d46a03cf6f9.html
http://my.oschina.net/ryanhoo/blog/260945?p=1
