NullPointerException при открытии настроек языка и ввода

У меня есть рутированный Lenovo P770, где я удалил несколько «системных» приложений, включая стандартную клавиатуру TouchPal. После сброса настроек я установил AnySoftKeyboard с помощью adb( adb shell ime...), и теперь он работает. Однако я больше не могу получить доступ к настройкам языка и ввода, так как получаю сообщение «К сожалению, настройки остановлены» в тот момент, когда я нажимаю на элемент меню. Вот трассировка стека из 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

Поскольку в трассировке стека упоминается VoiceInputOutputSettings, я попытался установить приложение Google (насколько я понимаю, оно предоставляет возможности распознавания голоса), но это ничего не изменило. Так же пробовал установить TouchPal из маркета, тоже безрезультатно.

Вот записи, settings.dbкоторые кажутся актуальными:

_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

Как я могу исправить этот сбой?

Перепрошивка стокового ПЗУ, вероятно, сработает. Тогда просто воздержитесь от удаления системных приложений, необходимых для работы системы.
@DanHulme Я считаю, что эту проблему можно решить без полной перепрошивки. TouchPal определенно не является приложением, которое требуется для работы Android.
Может быть. Часть настроек языка и ввода, часть «Язык», в некоторых случаях может размещаться в установленном и включенном приложении клавиатуры, и оттуда могут быть другие перекрестные ссылки на системное приложение клавиатуры по умолчанию. Если бы вы могли получить APK-файл TouchPal и отправить его в /system/appи, возможно /system/priv-app, в зависимости от того, где он был установлен ранее, это могло бы исправить это, учитывая перезагрузку и, возможно, еще один сброс настроек. В следующий раз знайте, что вы можете безопасно избавиться от бесполезных игр и некоторых приложений Play, но оставьте приложение клавиатуры в покое.
Я взял последнюю версию TouchPal из Play Store и «преобразовал ее в системное приложение» с помощью Titanium. Я полагаю, что это равносильно перемещению APK в /system/app. Это ничего не изменило.

Ответы (1)

Исправлено установкой Google TTS .


Это можно определить из трассировки стека и исходного кода приложения настроек :

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

Звонок removePreferenceпрерывался. По-видимому, я также удалил Google TTS, который был в комплекте с этой версией Android.