Comportamento diferente de XmlPullParser.getInputEncoding () nas versões API11 + e pré-API11 do Android

Estou desenvolvendo um novo recurso para o meu aplicativo Android para permitir backup e restauração de dados. Eu estou usando arquivos XML para fazer backup de dados. Este é um trecho de código que define a codificação para um arquivo de saída:

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

É assim que eu tento importar dados de um arquivo XML. Primeiro, eu verifiquei se a codificação está correta:

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

E aqui estou me deparando com um problema. Este código funciona bem no Android 2.3.3 (um dispositivo e um emulador), a codificação é corretamente detectada como "UTF-8". Mas nas versões API11 + (Honeycomb, ICS, JB) a exceção é lançada. Quando eu executo isso no modo de depuração, posso ver que parser.getInputEncoding () retornanull. Eu verifiquei os arquivos XML reais produzidos em 2.3.3 e versões posteriores e eles têm exatamente os mesmos cabeçalhos:<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>. Por que getInputEncoding () retorna null em API11 +?

Descobertas adicionais:

Descobri que existe uma maneira de detectar corretamente a codificação de arquivos em dispositivos API11 + usandoFileInputStream ao invés deFileReader como isso:

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

Nesse caso, getInputEncoding () detecta corretamente a codificação UTF-8 em emuladores e dispositivos API11 +, mas retorna null em 2.3.3. Por enquanto, posso inserir um fork no código para usar o FileReader na API11 + e no FileInputStream na pré-API11:

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

Mas qual é a maneira correta de verificar a codificação com XmlPullParser.getInputEncoding ()? Por que diferentes versões do Android se comportam de maneira diferente dependendo de qual delas eu uso: FileInputStream ou FileReader?

questionAnswers(2)

yourAnswerToTheQuestion