需要隐藏Android"概述屏幕"中的程序内容

Hea*_*eek 7 android

我正在为安全意识的雇主开发Android应用程序.他担心概述屏幕(也就是最近的任务列表)上出现的屏幕快照会泄漏敏感信息,并希望我在系统拍摄之前放置程序的启动画面.不幸的是我没有找到任何办法.

我试过的事情:

  • onPause功能中为启动画面的视图充气.(没有效果,即使有bringToFrontsetVisibility(View.VISIBLE).)
  • 充气闪屏的视图中onCreate,并使用bringToFrontonPause.(再一次,没有效果.)
  • 呼叫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设备或模拟器上测试您的代码.

  • 不幸的是“onCreateThumbnail”似乎不起作用。它从未在这里被调用过(Android 4.4 和 5.0),我发现了这个:<https://code.google.com/p/android/issues/detail?id=29370>。`FLAG_SECURE` 也有它自己的麻烦,部分描述如下:<http://stackoverflow.com/a/11121897/12193>。嗯,保持冷静,继续前进。;-) (2认同)

D. *_*aul 5

这是一个隐藏应用程序内容的解决方案,当应用程序被置于后台时,用闪屏覆盖它。这不是使用 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)