Różne zachowanie XmlPullParser.getInputEncoding () na wersjach Androida z API11 + i przed API11

Opracowuję nową funkcję mojej aplikacji na Androida, która umożliwia tworzenie kopii zapasowych i przywracanie danych. Używam plików XML do tworzenia kopii zapasowych danych. Jest to fragment kodu, który ustawia kodowanie pliku wyjściowego:

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

W ten sposób próbuję importować dane z pliku XML. Najpierw sprawdzam, czy kodowanie jest poprawne:

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

I tu mam problem. Ten kod działa dobrze na Androidzie 2.3.3 (zarówno urządzeniu, jak i emulatorze), kodowanie jest poprawnie wykrywane jako „UTF-8”. Ale w wersjach API11 + (Honeycomb, ICS, JB) wyjątek jest zgłaszany. Kiedy uruchamiam to w trybie debugowania, widzę, że zwraca parser.getInputEncoding ()null. Sprawdziłem rzeczywiste pliki XML wyprodukowane w wersji 2.3.3 i nowszych i mają dokładnie te same nagłówki:<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>. Dlaczego getInputEncoding () zwraca wartość null na API11 +?

Dodatkowe ustalenia:

Odkryłem, że istnieje sposób na prawidłowe wykrywanie kodowania plików na urządzeniach API11 +FileInputStream zamiastFileReader lubię to:

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

W tym przypadku getInputEncoding () poprawnie wykrywa kodowanie UTF-8 w emulatorach i urządzeniach API11 +, ale zwraca wartość null w 2.3.3. Na razie mogę wstawić widelec w kodzie, aby użyć FileReader na API11 + i FileInputStream na pre-API11:

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

Ale jaki jest właściwy sposób sprawdzenia kodowania za pomocą XmlPullParser.getInputEncoding ()? Dlaczego różne wersje Androida zachowują się inaczej w zależności od tego, którego używam: FileInputStream lub FileReader?

questionAnswers(2)

yourAnswerToTheQuestion