简书链接:原创android利用反射禁止popwindow截屏(做键盘开发)
文章字数:60,阅读全文大约需要1分钟

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
            try {
Field windowManagerField = PopupWindow.class.getDeclaredField("mWindowManager");
windowManagerField.setAccessible(true);
final Object o = windowManagerField.get(mPreviewPopup);

Object windowManagerProy = Proxy.newProxyInstance(Handler.class.getClassLoader(), new Class[]{WindowManager.class}, new InvocationHandler() {

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// if( public void addView(View view, ViewGroup.LayoutParams params);)
if (method.getName().equals("addView") && args.length == 2) {
PopupWrapper.this.mDecorView = args[0];
PopupWrapper.this.mWindowParams = (WindowManager.LayoutParams) args[1];
PopupWrapper.this.screenShot(mSafeEditView.isDisableCatupreScreen());
}
return method.invoke(o, args);
}
});
windowManagerField.set(mPreviewPopup, windowManagerProy);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}

public void screenShot(boolean disableCapture) {
if (disableCapture) {
addFlags(WindowManager.LayoutParams.FLAG_SECURE);

} else {
clearFlags(WindowManager.LayoutParams.FLAG_SECURE);//避免导致 吧activity的防止截屏给取消了。理论上 activity设置就ok了。

}

}

public WindowManager.LayoutParams getAttributes() {
return mWindowParams;
}

public void clearFlags(int flags) {
setFlags(0, flags);
}

public void setFlags(int flags, int mask) {
final WindowManager.LayoutParams attrs = getAttributes();
if (attrs == null) {
return;
}
attrs.flags = (attrs.flags & ~mask) | (flags & mask);
}

public void addFlags(int flags) {
setFlags(flags, flags);
}