use*_*764 4 android overlay android-activity system-alert-window
我希望能够检测我的活动是否被系统警报或其他叠加层(例如,长按电源按钮时的电源菜单)或检测到我的启动的恶意软件所遮盖活动。我注意到在这种情况下,前台应用程序仍将是我的应用程序,因此我不能简单地将其作为前台应用程序。我还注意到,当我的活动被遮盖时,不会调用onPause(),因此我也无法在onPause()中放入任何逻辑。即使可以,我也必须区分系统警报/覆盖和用户按下“后退” /“主页”按钮。
我还有其他方法可以做到这一点吗?
您可以检查“活动”,“片段”或“视图”是否被遮盖。
对于Activity,您需要重写dispatchTouchEvent方法,并检查事件是否具有标志FLAG_WINDOW_IS_OBSCURED。有示例代码:
public class OverlayTouchActivity extends Activity {
private boolean mObscuredTouch;
public boolean isObscuredTouch() {
return mObscuredTouch;
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
mObscuredTouch = (event.getFlags() & MotionEvent.FLAG_WINDOW_IS_OBSCURED) != 0;
return super.dispatchTouchEvent(event);
}
}
Run Code Online (Sandbox Code Playgroud)
这是Android代码的一部分,请检查OverlayTouchActivity.java。为了检查Fragment是否被遮盖,请在Fragment中执行属于OverlayTouchActivity活动的以下代码:
OverlayTouchActivity activity = (OverlayTouchActivity) getActivity();
if (activity.isObscuredTouch()) {
// Fragment is bbscured
}
Run Code Online (Sandbox Code Playgroud)
请参阅AppPermissionsFragment.java片段(搜索OverlayTouchActivity)。
对于View,您应该重写onFilterTouchEventForSecurity方法。有关更多信息,请参见View文档的“ 安全性”部分。
您可以使用 PackageManager 查询哪些已安装的软件包具有可疑权限,例如 SYSTEM_ALERT_WINDOW、BIND_ACCESSIBILITY_SERVICE 或 BIND_DEVICE_ADMIN。