先前有个项目代码需要做代码审计,因此将大部分代码打包成library调用了,包括BaseActivity,项目当时做等保,屏蔽了截图功能,目前需要恢复.
屏蔽截图
首先讲如何屏蔽截图,一般只需要针对Activity设置Flag为FLAG_SECURE即可
我们选择在BaseActivity的onCreate方法中处理,这样所有继承的子类都实现了屏蔽截图.
1 2 3 4 5
| @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE); }
|
此时再截图就会提示“当前界面涉及隐私内容,不允许截屏”
解除截屏限制
解除方法很简单,直接去掉上述Flag即可,但是目前的项目存在的问题是BaseActivity在library中,没有办法直接修改aar中的代码,或者说修改aar中的代码太麻烦了,那么有没有更简单的方法呢?答案是有的:
在我的Application中有用到这样一行代码
1
| registerActivityLifecycleCallbacks(activityLifecycleCallbacks);
|
注册了所有activity的生命周期监听,可以用来处理应用切换到前台后台的监听,做一些诸如判断网络状态重连等。
1 2 3 4 5 6 7 8 9
| public interface ActivityLifecycleCallbacks { void onActivityCreated(Activity activity, Bundle savedInstanceState); void onActivityStarted(Activity activity); void onActivityResumed(Activity activity); void onActivityPaused(Activity activity); void onActivityStopped(Activity activity); void onActivitySaveInstanceState(Activity activity, Bundle outState); void onActivityDestroyed(Activity activity); }
|
既然如此,我们直接在onActivityCreated的时候处理不就行了吗?
1 2 3 4
| @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE); }
|
事实证明,并非如此。onActivityCreated确实会在onCreate之后调用,但是却是在super.onCreate(savedInstanceState);之后就已经调用了,我们的addFlags代码是在其后面写的,所以整个流程是
[onCreate的super.onCreate]{.label}
[onActivityCreated的clearFlags]{.label .warning}
[onCreate的addFlags]{.label .danger}
顺序不对,自然无法生效,所以我们只能在onActivityStarted中处理了
1 2 3 4 5 6 7 8 9 10 11 12 13
| @Override public void onActivityStarted(Activity activity) { activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE); if (activityCount == 0) { isForeground = true; INSLog.e("logan", "app回到前台,开始更新状态"); Intent intent = new Intent(); intent.setAction(QFMainActivity.ACTION_REFRESH_NETWORK_STATE); sendBroadcast(intent); } activityCount++; }
|
然后我们就能正常截图了。