2 votes

InputMethodManager: IME est mort: L'application s'est figée lors de la saisie rapide sur EditText

Je essaie de récupérer tout le texte de l'écran de Windows en utilisant Accessibility Service. Tout fonctionne mais lorsque je tape rapidement sur EditText, l'application et le clavier se figent en quelques secondes. C'est très étrange car cela n'arrive qu'avec tous les EditText de mon application alors que cela ne se produit pas avec les autres applications.

Voici mon code. Je capture chaque événement et j'utilise un appel récursif pour obtenir le texte en profondeur à l'intérieur de AccessibilityNodeInfo. Merci !

public class WebAccessibilityService extends AccessibilityService {
....

    @Override
    public void onAccessibilityEvent(final AccessibilityEvent event) {

   CharSequence eventPackageName = event.getPackageName();
        if (eventPackageName != null) {
            if (eventPackageName.equals(BuildConfig.APPLICATION_ID))    return;
            int eventType = event.getEventType();
            if (eventType == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED || eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
                AccessibilityNodeInfo mNodeInfo = event.getSource();
                String value = getAllTextViews(mNodeInfo); //Quand je supprime cette ligne, l'application ne se fige plus.
            }
        }
    }

   private String getAllTextViews(AccessibilityNodeInfo nodeInfo){
        if (nodeInfo == null) return "";
        StringBuilder val = new StringBuilder();

        if (!TextUtils.isEmpty(nodeInfo.getText())) {
            val.append(nodeInfo.getText());
        }

        for (int i = 0; i < nodeInfo.getChildCount(); i++) {
            String v = getAllTextViews(nodeInfo.getChild(i));
            if (!TextUtils.isEmpty(v))
                val.append(v).append(" ");
        }
        return val.toString().replace('\n', ' ').replaceAll(" +", " ");
    }
}

Et le logcat

09-01 16:09:22.197 30797-30797/com.androidapp.watchme D/detect===: EventType=TYPE_WINDOW_CONTENT_CHANGED, package=com.sec.android.inputmethod
09-01 16:09:22.207 30797-30797/com.androidapp.watchme D/ViewRootImpl@aa32041[SettingsActivity]: ViewPostIme pointer 0
09-01 16:09:22.236 30797-30797/com.androidapp.watchme D/ViewRootImpl@aa32041[SettingsActivity]: ViewPostIme pointer 1
09-01 16:09:22.239 30797-30797/com.androidapp.watchme D/ViewRootImpl@aa32041[SettingsActivity]: ViewPostIme pointer 0
09-01 16:09:22.249 30797-30797/com.androidapp.watchme D/ViewRootImpl@aa32041[SettingsActivity]: ViewPostIme pointer 1
09-01 16:09:22.251 30797-30797/com.androidapp.watchme D/ViewRootImpl@aa32041[SettingsActivity]: ViewPostIme pointer 0
09-01 16:09:22.256 30797-30797/com.androidapp.watchme D/ViewRootImpl@aa32041[SettingsActivity]: ViewPostIme pointer 1
09-01 16:09:22.262 30797-30797/com.androidapp.watchme D/detect===: EventType=TYPE_WINDOW_CONTENT_CHANGED, package=com.sec.android.inputmethod
09-01 16:09:22.265 30797-30797/com.androidapp.watchme I/Choreographer: Skipped 303 frames!  The application may be doing too much work on its main thread.
09-01 16:09:22.274 30797-30797/com.andr...

0voto

ChrisCM Points 3471

Pour être honnête, la première chose que j'ai remarquée est que c'est un appareil Samsung.

09-01 16:09:22.287 30797-30797/com.androidapp.watchme W/InputMethodManager: IME died: com.sec.android.inputmethod/.SamsungKeypad

Avez-vous essayé de reproduire ce comportement sur un appareil Pixel ou Nexus?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X