2016-06-01 11 views
11

Sto sviluppando un'applicazione per uso commerciale con un servizio in background che riceve numeri di transponder (di animali) da un lettore RFID tramite bluetooth.Copia e incolla Android su qualsiasi campo di testo in qualsiasi applicazione

Dopo aver elaborato il numero ricevuto, desidero inviarlo negli Appunti e incollarlo nel campo di testo focalizzato di qualsiasi applicazione è attualmente davanti che nel mio caso è un'app browser.

Ho già trovato un similar question from 2013 ma con nessuna risposta accettata ormai. Tutte le risposte alla domanda hanno appena spiegato come utilizzare ClipboardManager per copiare e incollare il codice all'interno dell'applicazione sviluppata ma che non è stato inteso dal problema come ha chiarito in uno comment.

Lo scenario più semplice che potessi immaginare è quello di simulare un'azione di inserimento sul dispositivo Android. Preferirei non dover installare un'app di terze parti.

risposta

8

solo per aggiungere alla risposta di Kirill e ipotizzando l'applicazione ha permesso di Accessibilità,

Creare una classe che estende AccessibilityService e sovrascrivere onAccessibilityEvent metodo.

public class SampleAccessibilityService extends AccessibilityService { 

    @Override 
    public void onAccessibilityEvent(AccessibilityEvent accessibilityEvent) { 
     AccessibilityNodeInfo source = accessibilityEvent.getSource(); 
     if (source != null) { 
      AccessibilityNodeInfo rowNode = getRootInActiveWindow(); 
      if (rowNode != null) { 
       for (int i = 0; i < rowNode.getChildCount(); i++) { 
        AccessibilityNodeInfo accessibilityNodeInfo = rowNode.getChild(i); 
        if (accessibilityNodeInfo.isEditable() && accessibilityNodeInfo.isFocused()) { 
         accessibilityNodeInfo.performAction(AccessibilityNodeInfoCompat.ACTION_PASTE); 
         return; 
        } 
       } 
      } 
     } 
    } 

    @Override 
    public void onInterrupt() { 

    } 
} 

accessibilityNodeInfo.performAction(AccessibilityNodeInfoCompat.ACTION_PASTE) si incolla il testo che viene copiato negli appunti.

Assicurarsi inoltre di avere una corretta configurazione di accessibilità.

config.xml

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" 
    android:accessibilityFlags="flagDefault" 
    android:accessibilityEventTypes="typeViewClicked|typeViewFocused" 
    android:accessibilityFeedbackType="feedbackGeneric" 
    android:notificationTimeout="0" 
    android:canRetrieveWindowContent="true" 
    android:description="@string/testing" /> 

Qui android:accessibilityEventTypes="typeViewClicked|typeViewFocused" filtrerà gli eventi per vedere clicca o vista messa a fuoco.

È possibile anche gli eventi in base ai pacchetti utilizzando "android:packageNames" (in modo che il servizio non verrà chiamato spesso)

Infine dichiarare il servizio nel manifesto,

<service android:name=".SampleAccessibilityService" 
      android:label="@string/app_name" 
      android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"> 
      <intent-filter> 
       <action android:name="android.accessibilityservice.AccessibilityService"/> 
      </intent-filter> 
      <meta-data 
       android:name="android.accessibilityservice" 
       android:resource="@xml/config" /> 
</service> 
+0

Penso che sia una risposta molto completa e quindi la contrassegnerò come Risposta. Sembra fare esattamente ciò di cui abbiamo bisogno, anche se non posso testarlo al momento a causa di altre priorità. Inoltre abbiamo trovato [BluePiano: Bluetooth Keyboard-Wedge per Android di TEC-IT] [http://www.tec-it.com/en/software/android/bluepiano/keyboard-wedge/Default.aspx] che farà per adesso. –

6

Se vuoi che la tua app interagisca con un'app che non è la tua (il browser) dovrai dare a questa app accessibility permissions. si tratta di un tipo speciale di autorizzazione che consente alle app di interagire con qualcosa che è un po 'più sensibile.

ci sono azioni di accessibilità, quella che stai cercando è la AccessibilityNodeInfoCompat.ACTION_PASTE ti permette di preformare una pasta in un campo focalizzato.

Nota che ti consiglio di sostituire il browser con un inapp WebView e di iniettare i valori con javascript questa soluzione sarà molto più robusta per la tua automazione. è possibile trovare ulteriori informazioni su come eseguire JS su una WebView qui: How to get return value from javascript in webview of android?

+0

Anche se la risposta colpisce il chiodo proprio sulla testa ho optato per la risposta di Govind perché fornisce ulteriori dettagli. –

Problemi correlati