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...