Unterschiedliches Verhalten von XmlPullParser.getInputEncoding () in API11 + - und Vor-API11-Versionen von Android

Ich entwickle eine neue Funktion für meine Android-App, um die Datensicherung und -wiederherstellung zu ermöglichen. Ich verwende XML-Dateien, um Daten zu sichern. Dies ist ein Teil des Codes, der die Codierung für eine Ausgabedatei festlegt:

XmlSerializer serializer = Xml.newSerializer();
FileWriter fileWriter = new FileWriter(file, false);
serializer.setOutput(fileWriter);
serializer.startDocument("UTF-8", true);
[... Write data to the file....]

So versuche ich, Daten aus einer XML-Datei zu importieren. Zuerst überprüfe ich, ob die Kodierung korrekt ist:

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....]

Und hier stoße ich auf ein Problem. Dieser Code funktioniert einwandfrei unter Android 2.3.3 (sowohl ein Gerät als auch ein Emulator). Die Codierung wird korrekt als "UTF-8" erkannt. Bei API11 + -Versionen (Honeycomb, ICS, JB) wird die Ausnahme ausgelöst. Wenn ich dies im Debug-Modus ausführe, kann ich sehen, dass parser.getInputEncoding () zurückgibtnull. Ich habe die tatsächlichen XML-Dateien überprüft, die in 2.3.3 und späteren Versionen erstellt wurden, und sie haben genau die gleichen Überschriften:<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>. Warum gibt getInputEncoding () auf API11 + null zurück?

Zusätzliche Erkenntnisse:

Ich habe festgestellt, dass es eine Möglichkeit gibt, die Dateicodierung auf API11 + -Geräten mithilfe von richtig zu erkennenFileInputStream anstattFileReader so was:

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....]

In diesem Fall erkennt getInputEncoding () die UTF-8-Codierung auf API11 + -Emulatoren und -Geräten ordnungsgemäß, gibt jedoch in 2.3.3 den Wert null zurück. Daher kann ich jetzt einen Fork in den Code einfügen, um FileReader für API11 + und FileInputStream für API11-Vorgängerversionen zu verwenden:

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    parser.setInput(stream, null);
} else {
    parser.setInput(reader);
}

Aber wie kann ich die Codierung mit XmlPullParser.getInputEncoding () überprüfen? Warum verhalten sich verschiedene Android-Versionen unterschiedlich, je nachdem, welche ich verwende: FileInputStream oder FileReader?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage