NullPointerException al abrir la configuración de idioma y entrada

Tengo un Lenovo P770 rooteado, donde desinstalé varias aplicaciones de "sistema", incluido el teclado estándar, TouchPal. Después de un restablecimiento de fábrica, instalé AnySoftKeyboard con adb( adb shell ime...), y ahora funciona. Sin embargo, ya no puedo acceder a la configuración de idioma y entrada, ya que recibo el mensaje "Desafortunadamente, la configuración se detuvo" en el momento en que toco el elemento del menú. Aquí está el stacktrace de adb logcat:

W/dalvikvm( 8972): threadid=1: thread exiting with uncaught exception (group=0x40db2908)
E/AndroidRuntime( 8972): FATAL EXCEPTION: main
E/AndroidRuntime( 8972): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.settings/com.android.settings.SubSettings}: java.lang.NullPointerException
E/AndroidRuntime( 8972):        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184)
E/AndroidRuntime( 8972):        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2211)
E/AndroidRuntime( 8972):        at android.app.ActivityThread.access$600(ActivityThread.java:149)
E/AndroidRuntime( 8972):        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1300)
E/AndroidRuntime( 8972):        at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 8972):        at android.os.Looper.loop(Looper.java:153)
E/AndroidRuntime( 8972):        at android.app.ActivityThread.main(ActivityThread.java:5108)
E/AndroidRuntime( 8972):        at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 8972):        at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime( 8972):        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993)
E/AndroidRuntime( 8972):        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:751)
E/AndroidRuntime( 8972):        at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 8972): Caused by: java.lang.NullPointerException
E/AndroidRuntime( 8972):        at android.preference.PreferenceGroup.removePreferenceInt(PreferenceGroup.java:181)
E/AndroidRuntime( 8972):        at android.preference.PreferenceGroup.removePreference(PreferenceGroup.java:174)
E/AndroidRuntime( 8972):        at com.android.settings.VoiceInputOutputSettings.populateOrRemoveTtsPrefs(VoiceInputOutputSettings.java:144)
E/AndroidRuntime( 8972):        at com.android.settings.VoiceInputOutputSettings.populateOrRemovePreferences(VoiceInputOutputSettings.java:94)
E/AndroidRuntime( 8972):        at com.android.settings.VoiceInputOutputSettings.onCreate(VoiceInputOutputSettings.java:89)
E/AndroidRuntime( 8972):        at com.android.settings.inputmethod.InputMethodAndLanguageSettings.onCreate(InputMethodAndLanguageSettings.java:121)
E/AndroidRuntime( 8972):        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:796)
E/AndroidRuntime( 8972):        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1035)
E/AndroidRuntime( 8972):        at android.app.BackStackRecord.run(BackStackRecord.java:635)
E/AndroidRuntime( 8972):        at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1397)
E/AndroidRuntime( 8972):        at android.app.Activity.performStart(Activity.java:5030)
E/AndroidRuntime( 8972):        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2157)
E/AndroidRuntime( 8972):        ... 11 more
W/ActivityManager(  351):   Force finishing activity com.android.settings/.SubSettings
W/ActivityManager(  351):   Force finishing activity com.android.settings/.Settings

Dado que el stacktrace menciona VoiceInputOutputSettings, intenté instalar la aplicación de Google (hasta donde yo entiendo, proporciona capacidades de reconocimiento de voz), pero eso no cambió nada. También intenté instalar TouchPal desde el mercado, sin ningún efecto.

Aquí están las entradas settings.dbque parecen relevantes:

_id,name,value
72,selected_spell_checker,com.google.android.inputmethod.latin/com.android.inputmethod.latin.spellcheck.AndroidSpellCheckerService
73,selected_spell_checker_subtype,0
94,input_methods_subtype_history,com.google.android.inputmethod.latin/com.android.inputmethod.latin.LatinIME;834845621:com.menny.android.anysoftkeyboard/.SoftKeyboard;-1
95,selected_input_method_subtype,-1
96,default_input_method,com.menny.android.anysoftkeyboard/.SoftKeyboard
97,enabled_input_methods,com.menny.android.anysoftkeyboard/.SoftKeyboard

¿Cómo puedo solucionar este bloqueo?

Volver a flashear la ROM de stock probablemente funcionaría. Luego, simplemente absténgase de desinstalar las aplicaciones del sistema que el sistema necesita para funcionar.
@DanHulme Creo que este problema se puede resolver sin volver a flashear por completo. TouchPal definitivamente no es un tipo de aplicación que se requiere para que Android funcione.
Puede ser. Una parte de la Configuración de idioma y entrada, la parte "Idioma", puede estar alojada en la aplicación de teclado instalada y habilitada en algunos casos, y puede haber otros enlaces cruzados desde allí a la aplicación de teclado predeterminada del sistema. Si pudiera tomar un APK de TouchPal y empujarlo a /system/appy posiblemente /system/priv-app, dependiendo de dónde se haya instalado anteriormente, eso podría solucionarlo, dado un reinicio y posiblemente otro restablecimiento de fábrica. A partir de la próxima vez, sepa que puede deshacerse de forma segura de los juegos inútiles y algunas aplicaciones de Play, pero deje la aplicación de teclado en paz.
Tomé la última versión de TouchPal de Play Store y la "convertí en una aplicación del sistema" usando Titanium. Supongo que eso es igual a mover el APK a /system/app. Eso no cambió nada.

Respuestas (1)

Se solucionó instalando Google TTS .


Esto podría determinarse a partir del stacktrace y el código fuente de la aplicación de configuración :

public void onCreate() {
    mParent = mFragment.getPreferenceScreen();
    mVoiceCategory = (PreferenceCategory) mParent.findPreference(KEY_VOICE_CATEGORY);
    mTtsSettingsPref = mVoiceCategory.findPreference(KEY_TTS_SETTINGS);

    populateOrRemovePreferences();
}

private void populateOrRemovePreferences() {
    boolean hasTtsPrefs = populateOrRemoveTtsPrefs();
    if (!hasTtsPrefs) {
        // There were no TTS settings and no recognizer settings,
        // so it should be safe to hide the preference category
        // entirely.
        mFragment.getPreferenceScreen().removePreference(mVoiceCategory);
    }
}

private boolean populateOrRemoveTtsPrefs() {
    if (mTtsEngines.getEngines().isEmpty()) {
        mVoiceCategory.removePreference(mTtsSettingsPref);
        return false;
    }

    return true;
}

La removePreferencellamada se colapsaba. Aparentemente, también había desinstalado Google TTS, que se incluía con esta versión de Android.