fix fucking accessibility service

This commit is contained in:
hyb1996
2017-07-16 10:19:07 +08:00
parent fcf46c49de
commit 73773faedc
13 changed files with 186 additions and 69 deletions

View File

@@ -1,22 +1,25 @@
package com.stardust.view.accessibility;
import android.content.Context;
import android.graphics.Rect;
import android.os.Build;
import android.support.annotation.CallSuper;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.KeyEvent;
import android.view.WindowManager;
import android.view.InputDevice;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.TextView;
import android.widget.FrameLayout;
import com.stardust.util.ScreenMetrics;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;
import java.util.Timer;
import java.util.TimerTask;
import java.util.TreeMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
@@ -27,8 +30,6 @@ import java.util.concurrent.locks.ReentrantLock;
public class AccessibilityService extends android.accessibilityservice.AccessibilityService {
private AccessibilityNodeInfo mRootInActiveWindow;
private static final String TAG = "AccessibilityService";
@@ -38,6 +39,8 @@ public class AccessibilityService extends android.accessibilityservice.Accessibi
private static AccessibilityService instance;
private static boolean containsAllEventTypes = false;
private static final Set<Integer> eventTypes = new HashSet<>();
private volatile AccessibilityNodeInfo mRootInActiveWindow;
private Timer mTimer;
public static void addDelegate(int uniquePriority, AccessibilityDelegate delegate) {
mDelegates.put(uniquePriority, delegate);
@@ -59,15 +62,6 @@ public class AccessibilityService extends android.accessibilityservice.Accessibi
@Override
public void onAccessibilityEvent(final AccessibilityEvent event) {
Log.v(TAG, "onAccessibilityEvent: " + event);
if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED
|| event.getEventType() == AccessibilityEvent.TYPE_VIEW_HOVER_ENTER
|| event.getEventType() == AccessibilityEvent.TYPE_VIEW_HOVER_EXIT) {
AccessibilityNodeInfo root = super.getRootInActiveWindow();
if (root != null) {
mRootInActiveWindow = root;
Log.d(TAG, "rootInActiveWindow: " + mRootInActiveWindow);
}
}
if (!containsAllEventTypes && !eventTypes.contains(event.getEventType()))
return;
for (Map.Entry<Integer, AccessibilityDelegate> entry : mDelegates.entrySet()) {
@@ -90,13 +84,17 @@ public class AccessibilityService extends android.accessibilityservice.Accessibi
@Override
public AccessibilityNodeInfo getRootInActiveWindow() {
return mRootInActiveWindow;
try {
return super.getRootInActiveWindow();
} catch (IllegalStateException e) {
return null;
}
}
@Override
public void onDestroy() {
instance = null;
mTimer.cancel();
super.onDestroy();
}
@@ -109,6 +107,16 @@ public class AccessibilityService extends android.accessibilityservice.Accessibi
LOCK.lock();
ENABLED.signalAll();
LOCK.unlock();
mTimer = new Timer();
mTimer.schedule(new TimerTask() {
@Override
public void run() {
AccessibilityNodeInfo root = getRootInActiveWindow();
if (root != null) {
mRootInActiveWindow = root;
}
}
}, 0, 100);
// FIXME: 2017/2/12 有时在无障碍中开启服务后这里不会调用服务也不会运行安卓的BUG???
}

View File

@@ -0,0 +1,27 @@
package com.stardust.view.accessibility;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.view.accessibility.AccessibilityNodeInfo;
/**
* Created by Stardust on 2017/7/13.
*/
public class LayoutInspectService extends AccessibilityService {
private static LayoutInspectService instance;
public static LayoutInspectService getInstance() {
return instance;
}
@Override
protected void onServiceConnected() {
AccessibilityServiceInfo info = getServiceInfo();
info.flags |= AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS;
setServiceInfo(info);
super.onServiceConnected();
}
}