8 votes

Android Texte cliquable à l'écran

J'étais curieux, j'ai vu cette application l'autre jour qui permettait d'ouvrir d'autres applications et de configurer certaines fonctions automatiquement pour vous. J'ai réalisé qu'elle doit utiliser une fonction de clic à l'écran de quelque sorte, mais je n'arrive pas à trouver de documentation pour quelque chose comme ça. Par exemple, si nous connaissons le texte à l'écran de l'autre application comme étant "Prêt", y a-t-il un moyen de lire ce texte et peut-être faire quelque chose comme :

protected void processText(String text)
{
  if (text.contains("Prêt"))
      // cliquer sur le texte prêt
}

4voto

Abraham TS Points 170

J'ai fait cela en utilisant AccessibilityService. Cela ne fonctionnera bien que sur API level >= 16 cependant.

Vous devez étendre AccessibilityService. Par exemple, cette classe obtiendra le texte des réponses USSD et fermera la boîte de dialogue.

// ....
public class UssdAccessibilityService extends AccessibilityService {
    public UssdAccessibilityService() {
    }

    @TargetApi(16)
    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        if (!"com.android.phone".equalsIgnoreCase((String)event.getPackageName())){
            // Dans cet exemple, nous ne nous intéressons qu'aux événements provenant du package "com.android.phone"
            event.recycle();
            return;
        }

        String className = (String)event.getClassName();
        if (className == null || (!className.contains("AlertDialog") && !className.contains("AlertDialog"))){
            // La classe n'est pas une boîte de dialogue USSD
            event.recycle();
            return;
        }

        AccessibilityNodeInfo source = event.getSource();
        if (source == null) {
            // getSource() est annoté @Nullable, donc nous faisons cela pour être en sécurité au cas où
            event.recycle();
            return;
        }

        AccessibilityNodeInfo acceptButton = null;
        String ussdText = null;

        int childCount = source.getChildCount();
        for (int i = 0; i < childCount; i++){
            AccessibilityNodeInfo current = source.getChild(i);
            if (current == null)
                continue;

            String currentText = (String)current.getText();
            if (current.isClickable()){
                // Dans le cas des boîtes de dialogue USSD, il n'y a qu'un élément cliquable.
                // Il peut être nécessaire de faire une recherche plus robuste dans d'autres scénarios
                acceptButton = current;
                continue;
            }

            ussdText = currentText;

            current.recycle();
        }

        if (ussdText!= null) {
            if (acceptButton != null)
                acceptButton.performAction(AccessibilityNodeInfo.ACTION_CLICK);

        }

        source.recycle();
        event.recycle();
    }

    // ....
}

Vous devez déclarer le service d'accessibilité dans le manifeste sous

Sous res/xml créer accessibility_service_config.xml

Bien sûr, vous devez adapter ce code à vos besoins.

Enfin, vous devrez activer le service d'accessibilité manuellement dans Paramètres > Accessibilité sur Android (ou demander à l'utilisateur de le faire).

En savoir plus ... Développer un service d'accessibilité

3voto

ziLk Points 2219

Pour pouvoir le faire depuis une autre application, vous devez capturer l'écran et déterminer la position du texte en utilisant le service de reconnaissance de texte.

lorsqu'une autre application est active, votre application doit également être active pour pouvoir capturer l'écran. Vous ne pouvez donc utiliser que le service Android qui fonctionne toujours en arrière-plan.

Cependant, pour capturer une capture d'écran pour votre activité, vous devez avoir une Vue de votre activité, ce qui n'est pas présent dans votre service, vous devez donc créer une TimerTask qui appellera votre activité toutes les heures et votre activité y répondra avec la vue actuelle qui apparaît et vous pourrez capturer la capture d'écran à partir de là.

Ou si vous souhaitez prendre une capture d'écran de l'écran actuel de votre appareil (n'importe quelle application), alors vous devez avoir la permission root, et lire le framebuffer pour obtenir les données brutes de l'écran actuel, puis les convertir en bitmap ou en tout autre fichier image que vous pouvez le faire dans votre service.

En bref, cela est possible pour les téléphones rootés. Sinon, vous ne pouvez pas prendre de capture d'écran d'autres applications si vous n'êtes pas rooté. Vous êtes autorisé uniquement à prendre une capture d'écran de votre application.

Pour pouvoir analyser l'écran pour voir s'il y a du texte "Ready" ou non, votre application doit être active pour pouvoir capturer l'écran.

0voto

Thracian Points 1602

Au lieu d'essayer de lire du texte, utilisez un récepteur de diffusion et à chaque diffusion vérifiez la longueur des textviews lorsqu'elles sont définies, démarrez une application ou faites ce que vous souhaitez.

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