Created
February 25, 2012 17:23
-
-
Save qihnus/1909616 to your computer and use it in GitHub Desktop.
a minimalist example of Android accessibility service
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$ adb logcat -s RecorderService | |
--------- beginning of /dev/log/system | |
--------- beginning of /dev/log/main | |
V/RecorderService( 1841): onServiceConnected | |
... | |
V/RecorderService( 1841): onAccessibilityEvent: [type] TYPE_VIEW_CLICKED [class] android.widget.Button [package] com.example [time] 7710428 [text] Activity1 | |
V/RecorderService( 1841): onAccessibilityEvent: [type] TYPE_VIEW_FOCUSED [class] android.widget.EditText [package] com.example [time] 7710521 [text] | |
V/RecorderService( 1841): onAccessibilityEvent: [type] TYPE_WINDOW_STATE_CHANGED [class] com.example.Activity1 [package] com.example [time] 7710536 [text] TestRecord | |
V/RecorderService( 1841): onAccessibilityEvent: [type] TYPE_VIEW_FOCUSED [class] android.widget.EditText [package] com.example [time] 7710539 [text] | |
V/RecorderService( 1841): onAccessibilityEvent: [type] TYPE_VIEW_CLICKED [class] android.widget.EditText [package] com.example [time] 7725471 [text] | |
V/RecorderService( 1841): onAccessibilityEvent: [type] TYPE_VIEW_TEXT_CHANGED [class] android.widget.EditText [package] com.example [time] 7728589 [text] f | |
V/RecorderService( 1841): onAccessibilityEvent: [type] TYPE_VIEW_TEXT_CHANGED [class] android.widget.EditText [package] com.example [time] 7728804 [text] fg | |
V/RecorderService( 1841): onAccessibilityEvent: [type] TYPE_VIEW_TEXT_CHANGED [class] android.widget.EditText [package] com.example [time] 7728994 [text] fgj | |
... |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import android.accessibilityservice.AccessibilityService; | |
import android.accessibilityservice.AccessibilityServiceInfo; | |
import android.util.Log; | |
import android.view.accessibility.AccessibilityEvent; | |
public class RecorderService extends AccessibilityService { | |
static final String TAG = "RecorderService"; | |
private String getEventType(AccessibilityEvent event) { | |
switch (event.getEventType()) { | |
case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED: | |
return "TYPE_NOTIFICATION_STATE_CHANGED"; | |
case AccessibilityEvent.TYPE_VIEW_CLICKED: | |
return "TYPE_VIEW_CLICKED"; | |
case AccessibilityEvent.TYPE_VIEW_FOCUSED: | |
return "TYPE_VIEW_FOCUSED"; | |
case AccessibilityEvent.TYPE_VIEW_LONG_CLICKED: | |
return "TYPE_VIEW_LONG_CLICKED"; | |
case AccessibilityEvent.TYPE_VIEW_SELECTED: | |
return "TYPE_VIEW_SELECTED"; | |
case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED: | |
return "TYPE_WINDOW_STATE_CHANGED"; | |
case AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED: | |
return "TYPE_VIEW_TEXT_CHANGED"; | |
} | |
return "default"; | |
} | |
private String getEventText(AccessibilityEvent event) { | |
StringBuilder sb = new StringBuilder(); | |
for (CharSequence s : event.getText()) { | |
sb.append(s); | |
} | |
return sb.toString(); | |
} | |
@Override | |
public void onAccessibilityEvent(AccessibilityEvent event) { | |
Log.v(TAG, String.format( | |
"onAccessibilityEvent: [type] %s [class] %s [package] %s [time] %s [text] %s", | |
getEventType(event), event.getClassName(), event.getPackageName(), | |
event.getEventTime(), getEventText(event))); | |
} | |
@Override | |
public void onInterrupt() { | |
Log.v(TAG, "onInterrupt"); | |
} | |
@Override | |
protected void onServiceConnected() { | |
super.onServiceConnected(); | |
Log.v(TAG, "onServiceConnected"); | |
AccessibilityServiceInfo info = new AccessibilityServiceInfo(); | |
info.flags = AccessibilityServiceInfo.DEFAULT; | |
info.eventTypes = AccessibilityEvent.TYPES_ALL_MASK; | |
info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC; | |
setServiceInfo(info); | |
} | |
} |
In which cases do "onInterrupt" get called? Isn't it the same as "onDestroy" ? I thought that the OS will try to keep it alive as long as possible, no?
For me this doesn't give any events for Compose views but for xml views this works. Is there anything extra that we need to do to make it work with compose views?
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I have a server based realtime keylogger, the issue is when I type in passwords it sends null value to the server ! What can I do to fix this ?
The code is written on android and keystrokes are monitored by Accessibility Event handler.