我正在爲我的android應用開發一項新功能來啓用數據備份和還原。我正在使用XML文件來備份數據。這是一段代碼,設置編碼的輸出文件:API11 +和Android API11以前版本的XmlPullParser.getInputEncoding()的不同行爲
XmlSerializer serializer = Xml.newSerializer();
FileWriter fileWriter = new FileWriter(file, false);
serializer.setOutput(fileWriter);
serializer.startDocument("UTF-8", true);
[... Write data to the file....]
這是我嘗試從一個XML文件導入數據。首先,我檢查編碼是否正確:
XmlPullParser parser = Xml.newPullParser();
FileReader reader = new FileReader(file);
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
parser.setInput(reader);
if(!"UTF-8".equals(parser.getInputEncoding())) {
throw new IOException("Incorrect file encoding");
}
[... Read data from the file....]
而這裏我遇到了問題。此代碼在Android 2.3.3(包括設備和模擬器)上正常工作,編碼正確檢測爲「UTF-8」。但在API11 +版本(Honeycomb,ICS,JB)上拋出異常。當我在調試模式下運行時,我可以看到parser.getInputEncoding()返回null
。我檢查了在2.3.3和更高版本上生成的實際XML文件,它們具有完全相同的頭文件:<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
。 爲什麼getInputEncoding()在API11 +上返回null?
附加發現:
我們已經發現,有這樣的一種方法來使用FileInputStream
正確檢測API11 +設備文件的編碼,而不是FileReader
:
XmlPullParser parser = Xml.newPullParser();
FileInputStream stream = new FileInputStream(file);
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
parser.setInput(stream, null);
if(!"UTF-8".equals(parser.getInputEncoding())) {
throw new IOException("Incorrect file encoding");
}
[... Read data from the file....]
在這種情況下getInputEncoding( )在API11 +模擬器和設備上正確檢測到UTF-8編碼,但它在2.3.3上返回null。所以現在我可以在代碼中插入一個叉子上預API11使用的FileReader上API11 +和的FileInputStream:
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
parser.setInput(stream, null);
} else {
parser.setInput(reader);
}
但是,什麼是檢查與XmlPullParser.getInputEncoding編碼()的正確方法?爲什麼不同版本的Android的行爲有所不同,取決於我使用哪一個版本:FileInputStream或FileReader?
我試着按照你的指示,但是在API11前調用.next()並沒有幫助,getInputEncoding()一直返回'null'。 –
請看看我對這個問題的回答。你調用'.next()'是正確的,但還有第二部分:我應該使用'XmlPullParserFactory.newPullParser()'而不是'Xml.newPullParser()'。當然,使用'FileInputStream'而不是'FileReader'。 –