NullPointerException beim Öffnen der Sprach- und Eingabeeinstellungen

Ich habe ein gerootetes Lenovo P770, bei dem ich mehrere "System" -Apps deinstalliert habe, einschließlich der Standardtastatur TouchPal. Nach einem Werksreset habe ich AnySoftKeyboard mit adb( adb shell ime...) installiert und jetzt funktioniert es. Ich kann jedoch nicht mehr auf die Sprach- und Eingabeeinstellungen zugreifen, da ich die Meldung „Leider wurden die Einstellungen gestoppt“ erhalte, sobald ich auf den Menüpunkt tippe. Hier ist der Stacktrace von 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

Da der Stacktrace erwähnt VoiceInputOutputSettings, habe ich versucht, die Google-App zu installieren (soweit ich verstehe, bietet sie Spracherkennungsfunktionen), aber das hat nichts geändert. Ich habe auch versucht, TouchPal vom Markt zu installieren, ebenfalls ohne Erfolg.

Hier sind die Einträge, settings.dbdie relevant erscheinen:

_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

Wie kann ich diesen Absturz beheben?

Ein Flashen des Stock-ROMs würde wahrscheinlich funktionieren. Unterlassen Sie dann einfach die Deinstallation von System-Apps, die das System zum Funktionieren benötigt.
@DanHulme Ich glaube, dieses Problem kann ohne vollständiges Reflashing gelöst werden. TouchPal ist definitiv keine Art von App, die für das Funktionieren von Android erforderlich ist.
Es könnte sein. Ein Teil der Sprach- und Eingabeeinstellungen, der Teil „Sprache“, wird in einigen Fällen möglicherweise von der installierten und aktivierten Tastatur-App gehostet, und es können andere Querverweise von dort zur standardmäßigen Tastatur-App des Systems vorhanden sein. Wenn Sie sich ein APK von TouchPal schnappen und es nach /system/appund möglicherweise verschieben könnten /system/priv-app, je nachdem, wo es zuvor installiert wurde, könnte dies bei einem Neustart und möglicherweise einem erneuten Zurücksetzen auf die Werkseinstellungen behoben werden. Wisse ab dem nächsten Mal, dass du die nutzlosen Spiele und einige Play-Apps sicher loswerden kannst, aber lass die Tastatur-App in Ruhe.
Ich habe mir die neueste Version von TouchPal aus dem Play Store geholt und sie mit Titanium in eine System-App konvertiert. Ich nehme an, das ist gleichbedeutend mit dem Verschieben der APK nach /system/app. Das hat nichts geändert.

Antworten (1)

Durch die Installation von Google TTS behoben .


Dies kann aus dem Stacktrace und dem Quellcode der Einstellungs-App ermittelt werden :

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;
}

Der removePreferenceAnruf brach zusammen. Anscheinend hatte ich auch Google TTS deinstalliert, das mit dieser Android-Version gebündelt war.