2016-04-22 11 views
0

Ich implementiere das Einfügen von Zwischenablage-Text in die EditText-Ansicht einer anderen Anwendung, wenn die Aktivitätsänderung mithilfe des Zugänglichkeitsdiensts erkannt wird.event.source() gibt null in android zurück

In meinem Accessibility Service funktioniert die Barrierefreiheitserkennung gut. Wenn onAccessibilityEvent jedoch aufgerufen wird, gibt der Code event.getSource() das Objekt null zurück.

public class ClipBoardPasteService extends AccessibilityService { 

ClipboardManager clipboard; 

@Override 
public void onCreate() { 
    super.onCreate(); 
    Log.i("MyTag", "clipboard service created"); 
} 

@Override 
public void onAccessibilityEvent(AccessibilityEvent event) { 
    Log.i("MyTag", "ClipBoardPastedService : onAccessibilityEvent"); 
     clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); 

     AccessibilityNodeInfo source = event.getSource(); 
     Log.i("MyTag", "source name : " + source.getViewIdResourceName()); 
     source.performAction(AccessibilityNodeInfo.ACTION_PASTE); 

} 


@Override 
protected void onServiceConnected() { 
    super.onServiceConnected(); 
    Log.i("MyTag", "ClipBoardPastedService : onServiceConnected"); 
    String[] packages = {"com.google.android.talk"}; 

    AccessibilityServiceInfo info = new AccessibilityServiceInfo(); 
    info.flags = AccessibilityServiceInfo.DEFAULT; 
    info.packageNames = packages; 
    //AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED 
    info.eventTypes = AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED; 
    info.eventTypes = AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED; 
    info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC; 
    setServiceInfo(info); 
    } 
} 

und dies ist ein Teil meines AndroidManifest.xml

<service 
     android:name=".ClipBoardPasteService" 
     android:enabled="true" 
     android:label="@string/app_name" 
     android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE" > 
     <intent-filter> 
      <action android:name="android.accessibilityservice.AccessibilityService" /> 
      <category android:name="android.accessibilityservice.category.FEEDBACK_SPOKEN" /> 
     </intent-filter> 
     <!-- from ICS --> 
     <meta-data 
      android:name="android.accessibilityservice" 
      android:resource="@xml/accessibility_service_config" /> 
    </service> 

dies accessibility_service_config.xml

<?xml version="1.0" encoding="utf-8"?> 
<accessibility-service 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:description="@string/service_description" 
    android:packageNames="@null" 
    android:accessibilityEventTypes="typeAllMask" 
    android:accessibilityFlags="flagDefault" 
    android:accessibilityFeedbackType="feedbackSpoken" 
    android:notificationTimeout="100" 
    android:canRetrieveWindowContent="true" 
android:settingsActivity="com.example.android.accessibility.ServiceSettingsActivity" 
/> 

Ich suchte und andere Stackoverflow des ähnlichen Fragen gefunden, aber die Antwort „Meta fehlt -Daten in Manifest "ergibt keinen Sinn. Was ist falsch an meinem Code?

Antwort

1

Nicht alle Ereignistypen haben eine Quelle. Sie sollten prüfen, ob das Ereignis von einem Typ ist, der über eine Quelle verfügt, und diese Ereignisse dann anders behandeln.

Zum Beispiel TYPE_WINDOWS_CHANGED hat keine Quelle, aber TYPE_VIEW_SCROLLED tut. Sie sollten die Android-Dokumentation sorgfältig durchlesen. Es ist ein wenig verwirrend, obwohl es eine Logik dazu gibt. Wenn in schlechter Dokumentation und API-Design matschig.

Beachten Sie auch, dass Ihr Code in Ihrer Konfiguration Ihre XML überschreibt. Entfernen Sie Ihre Paketnamen-Zeile in Ihrem XML-Code. Und entfernt den gesamten Code in Ihrem Online-Dienst verbunden. Sie überschreiben einfach die Konfiguration, die Sie in Ihrer Dienstkonfigurations-XML-Datei vorgenommen haben.

Schließlich sollte es eine gewisse Konfiguration Sie Code außer Kraft setzen müssen, verwenden, für einige dynamische Änderungen, sollten Sie immer (sprich: „fast immer“) macht sich so wie folgt aus:

AccessibilityServiceInfo info = getServiceInfo(); 
//modify info to your liking 
setServiceInfo(info); 

Dies stellt sicher, dass Sie erstellen eine korrekt aufgebaute Service-Info, mit den Parametern aus Ihrem XML zur Modifikation. Dies ist fast immer das, was über das Setzen einer komplett neuen Konfiguration hinaus beabsichtigt ist.

Quelle: http://developer.android.com/reference/android/view/accessibility/AccessibilityEvent.html

0

ich das gleiche Problem gegenüber und war zu AndroidManifest.xml

<application 
    ... 
    <uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE" /> 
    <service 
     ... 
    </service> 
    ... 
</application> 
durch das Hinzufügen dieser Erlaubnis zu können lösen sie in der Lage
Verwandte Themen