参考:http://blog.csdn.net/itfootball/article/details/21953763
实现监控手机的各种事件(点击,通知等等)
MyServer.java:
package com.example.xxh.accessibilityservertest; import android.accessibilityservice.AccessibilityService; import android.accessibilityservice.AccessibilityServiceInfo; import android.util.Log; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; /** * Created by xxh on 2017/9/20. */ public class MyServer extends AccessibilityService { private static final String TAG = "xxxxxxx"; @Override protected void onServiceConnected() { /*AccessibilityServiceInfo accessibilityServiceInfo = new AccessibilityServiceInfo(); accessibilityServiceInfo.eventTypes = AccessibilityEvent.TYPES_ALL_MASK; accessibilityServiceInfo.feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN; accessibilityServiceInfo.notificationTimeout = 1000; setServiceInfo(accessibilityServiceInfo);*/ Log.i(TAG, "config success"); } @Override public void onAccessibilityEvent(AccessibilityEvent event) { int eventType = event.getEventType(); String eventText = ""; switch (eventType) { case AccessibilityEvent.TYPE_VIEW_CLICKED: //Log.i(TAG, "==============Start===================="); eventText = "TYPE_VIEW_CLICKED"; /*AccessibilityNodeInfo nodeInfo = event.getSource(); Log.i(TAG, nodeInfo.toString());*/ //Log.i(TAG, "=============END====================="); break; case AccessibilityEvent.TYPE_VIEW_FOCUSED: eventText = "TYPE_VIEW_FOCUSED"; break; case AccessibilityEvent.TYPE_VIEW_LONG_CLICKED: eventText = "TYPE_VIEW_LONG_CLICKED"; break; case AccessibilityEvent.TYPE_VIEW_SELECTED: eventText = "TYPE_VIEW_SELECTED"; break; case AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED: eventText = "TYPE_VIEW_TEXT_CHANGED"; break; case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED: eventText = "TYPE_WINDOW_STATE_CHANGED"; break; case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED: eventText = "TYPE_NOTIFICATION_STATE_CHANGED"; Log.i(TAG, "==============Start===================="); AccessibilityNodeInfo nodeInfo = event.getSource(); if(nodeInfo == null) { Log.i(TAG, "eeeee"); return; } Log.i(TAG, nodeInfo.toString()); /*AccessibilityNodeInfo rowNode = getRootInActiveWindow(); if(rowNode == null) { Log.i(TAG, "noteInfo is null"); return; } else { recycle(rowNode); }*/ Log.i(TAG, "=============END====================="); break; case AccessibilityEvent.TYPE_TOUCH_EXPLORATION_GESTURE_END: eventText = "TYPE_TOUCH_EXPLORATION_GESTURE_END"; break; case AccessibilityEvent.TYPE_ANNOUNCEMENT: eventText = "TYPE_ANNOUNCEMENT"; break; case AccessibilityEvent.TYPE_TOUCH_EXPLORATION_GESTURE_START: eventText = "TYPE_TOUCH_EXPLORATION_GESTURE_START"; break; case AccessibilityEvent.TYPE_VIEW_HOVER_ENTER: eventText = "TYPE_VIEW_HOVER_ENTER"; break; case AccessibilityEvent.TYPE_VIEW_HOVER_EXIT: eventText = "TYPE_VIEW_HOVER_EXIT"; break; case AccessibilityEvent.TYPE_VIEW_SCROLLED: eventText = "TYPE_VIEW_SCROLLED"; break; case AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED: eventText = "TYPE_VIEW_TEXT_SELECTION_CHANGED"; break; case AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED: eventText = "TYPE_WINDOW_CONTENT_CHANGED"; break; } //eventText = eventText + ":" + eventType; //Log.i(TAG, eventText); } @Override public void onInterrupt() { } private void recycle(AccessibilityNodeInfo info) { if(info.getChildCount() == 0) { Log.i(TAG, "child widget ---------------" + info.getClassName()); Log.i(TAG, "showDialog:" + info.canOpenPopup()); Log.i(TAG, "text:" + info.getText()); Log.i(TAG, "windowId:" + info.getWindowId()); }else { for(int i = 0; i < info.getChildCount(); i++) { if(info.getChild(i) != null) { recycle(info.getChild(i)); } } } } }
MainActivity.java
package com.example.xxh.accessibilityservertest; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent intent = new Intent(); intent.setAction("android.accessibilityservice.AccessibilityService"); intent.setPackage(getPackageName()); startService(intent); Log.i("aaa","bbbbbbbbb"); } }
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.xxh.accessibilityservertest"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <service android:name=".MyServer" android:enabled="true" android:exported="true" 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/accessibility" /> </service> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application> </manifest>
accessibility.xml(res/xml/):
<?xml version="1.0" encoding="utf-8"?> <accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" android:accessibilityEventTypes="typeNotificationStateChanged|typeWindowStateChanged|typeWindowContentChanged|typeViewClicked|typeViewFocused" android:accessibilityFeedbackType="feedbackSpoken" android:accessibilityFlags="flagDefault" android:canRetrieveWindowContent="true" android:notificationTimeout="100" />