java.lang.VerifyError IllformedLocaleException
Eu tenho o seguinte método pai, usado em todos os casos por vários níveis de API:
public int setVoice (@NonNull final String language, @NonNull final String region){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
return setVoice21(language, region);
} else {
return setVoiceDeprecated(language, region);
}
}
esetVoice21
faz algo parecido com isto:
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public int setVoice21 ( @NonNull final String language, @NonNull final String region){
try {
// try some API 21 stuff
} catch (final IllformedLocaleException e) {
e.printStackTrace();
return setVoiceDeprecated(language, region);
}
setVoice21
contém outro código que requer a API 21+ especificamenteTextToSpeech.Voice eLocale.Builder
Quando executo esse código em um dispositivo <API 21, estou recebendo o seguinte erro:
W / dalvikvm: VFY: não é possível resolver a classe de exceção 6232 (Ljava / util / IllformedLocaleException;) W / dalvikvm: VFY: rejeitando o opcode 0x0d em 0x0168 W / dalvikvm: VFY: Lcom / myapp / android / speech / MyTextToSetech; (Ljava / lang / String; Ljava / lang / String;) IW / dalvikvm: Verificador rejeitado classe Lcom / myapp / android / speech / MyTextToSpeech;
E / AndroidRuntime: EXCEÇÃO FATAL: java.lang.VerifyError principal: com / myapp / android / speech / MyTextToSpeech
Se eu remover oIllformedLocaleException e substitua-o por uma exceção padrão, o aplicativo funciona bem, apesar das muitas outras referências aos métodos> API21 dentrosetVoice21
Para me confundir ainda mais,setVoice21
chama a seguinte classe
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private class TTSVoice {
public void buildVoice() {
try {
// Do some API 21 stuff
} catch (final IllformedLocaleException e) {
}
}
}
Esta classe é apenas referenciada emsetVoice21
, mas não preciso remover a referência a IllformedLocaleException aqui - posso deixá-lo e o aplicativo funciona bem .... Desconcertado.
Alguém pode me ajudar por que o IllformedLocaleException está causando essa falha? As exceções de alguma forma são tratadas de maneira diferente?
Eu agradeço antecipadamente.
Nota - Não tenho certeza de que seja relevante, mas estou subclassificandoTextToSpeech de uma maneira padrão. Temo que isso possa complicar a pergunta, mas por via das dúvidas ...
public class MyTextToSpeech extends TextToSpeech {
public MyTextToSpeech(final Context context, final OnInitListener listener) {
super(context, listener);
}
}
EDITAR - A solução alternativafornecida por razzledazzle abaixo, permite que o aplicativo seja executado sem travar, mas continuo sem saber por que essa etapa é necessária. Eu nunca tive que tomar essas medidas antes ao lidar com o versionamento da API.