Comportamiento diferente de XmlPullParser.getInputEncoding () en API11 + y versiones anteriores a API11 de Android

Estoy desarrollando una nueva función para mi aplicación de Android para habilitar la copia de seguridad y restauración de datos. Estoy usando archivos XML para hacer copias de seguridad de los datos. Este es un fragmento de código que establece la codificación de un archivo de salida:

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

Así es como trato de importar datos desde un archivo XML. Primero, verifico si la codificación es correcta:

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

Y aquí me encuentro con un problema. Este código funciona bien en Android 2.3.3 (tanto un dispositivo como un emulador), la codificación se detecta correctamente como "UTF-8". Pero en las versiones API11 + (Honeycomb, ICS, JB) se lanza la excepción. Cuando ejecuto esto en modo de depuración puedo ver que parser.getInputEncoding () devuelvenull. Revisé los archivos XML reales producidos en 2.3.3 y versiones posteriores y tienen exactamente los mismos encabezados:<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>. ¿Por qué getInputEncoding () devuelve nulo en API11 +?

Hallazgos adicionales:

Descubrí que hay una manera de detectar correctamente la codificación de archivos en dispositivos API11 + usandoFileInputStream en lugar deFileReader Me gusta esto:

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

En este caso, getInputEncoding () detecta correctamente la codificación UTF-8 en emuladores y dispositivos API11 +, pero devuelve un valor nulo en 2.3.3. Así que por ahora puedo insertar un código en el código para usar FileReader en API11 + y FileInputStream en pre-API11:

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

Pero, ¿cuál es la forma correcta de verificar la codificación con XmlPullParser.getInputEncoding ()? ¿Por qué las diferentes versiones de Android se comportan de manera diferente dependiendo de cuál uso: FileInputStream o FileReader?

Respuestas a la pregunta(2)

Su respuesta a la pregunta