我正在为安全意识的雇主开发Android应用程序.他担心概述屏幕(也就是最近的任务列表)上出现的屏幕快照会泄漏敏感信息,并希望我在系统拍摄之前放置程序的启动画面.不幸的是我没有找到任何办法.
我试过的事情:
onPause功能中为启动画面的视图充气.(没有效果,即使有bringToFront和setVisibility(View.VISIBLE).)onCreate,并使用bringToFront中onPause.(再一次,没有效果.)setVisible(false)在onPause.(看起来几乎可以工作,因为当切换到程序时,屏幕会立即闪烁为黑色,但在快照之前,系统显然会再次显示它.)setVisibility(View.INVISIBLE)View中最顶层的项目onPause.(看起来它会起作用,但快照显然是在它生效之前拍摄的.)我是一个中等成熟的Android开发人员,但我不禁觉得有一个我想念的简单解决方案.
Com*_*are 10
就个人而言,我会选择FLAG_SECURE,并且只是阻止在任何地方展示这些东西:
public class FlagSecureTestActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFlags(LayoutParams.FLAG_SECURE,
LayoutParams.FLAG_SECURE);
setContentView(R.layout.main);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,IIRC,您可以覆盖onCreateThumbnail()以提供您自己的图像以用于最近任务列表.请注意,这可能已经在Android 5.0中发生了变化,因为他们已经彻底检查了最近任务列表,因此请务必在5.0设备或模拟器上测试您的代码.
这是一个隐藏应用程序内容的解决方案,当应用程序被置于后台时,用闪屏覆盖它。这不是使用 FLAG_SECURE 技术,我只是覆盖屏幕的 onPause 和 onResume 方法并修改视图以显示一个覆盖后面所有内容的视图。
首先,我在一个单独的文件中创建我的启动画面,作为一个名为 splash_screen_custom 的相对布局,我还在文件中给相对布局一个 id customSplash。请注意高度设置,我遇到了按钮具有预设高度的问题,因此通过将此覆盖屏幕设置为具有高高度,它将覆盖任何按钮(当然,如果您不覆盖按钮,则不需要此设置)。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
android:id="@+id/customSplash"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/backgroundColor"
android:elevation="5dp"
>
<ImageView
android:id="@+id/imageView"
android:layout_width="202dp"
android:layout_height="157dp"
android:layout_centerInParent="true"
app:srcCompat="@drawable/yourImage" />
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我试图覆盖的屏幕是一个相对布局,所以我可以通过我试图覆盖的视图的 addView 和 removeView 方法简单地添加和删除我的启动画面。
override fun onPause() {
var parentView = findViewById<RelativeLayout>(R.id.parentView)
var splashScreen = layoutInflater.inflate(R.layout.splash_screen_custom, null)
parentView.addView(splashScreen, parentView.width, parentView.height)
super.onPause()
}
override fun onResume() {
var parentView = findViewById<RelativeLayout>(R.id.parentView)
parentView.removeView(findViewById<RelativeLayout>(R.id.customSplash))
super.onResume()
}
Run Code Online (Sandbox Code Playgroud)