How do I prevent Android taking a screenshot when my app goes to the background?

前端 未结 6 1172
说谎
说谎 2020-11-22 08:15

The app I\'m currently building has the requirement that the app has to prevent the OS to take a screenshot of the app when it\'s being pushed into the background for securi

相关标签:
6条回答
  • 2020-11-22 08:21

    Try FLAG_SECURE:

    public class FlagSecureTestActivity extends Activity {
      @Override
      public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,
                             WindowManager.LayoutParams.FLAG_SECURE);
    
        setContentView(R.layout.main);
      }
    }
    

    This definitely secures against manual screenshots and automatic screenshots from the ICS recent-tasks history. It also secures against screen recording (e.g., apps using the media projection APIs).

    UPDATE: it also secures against Now On Tap or other assistants on Android 6.0; they will not get access to the details of widgets and containers in your UI if the user brings up the assistant.

    UPDATE #2: however, not everything in the activity will be protected. Any pop-up windows — Dialog, Spinner, AutoCompleteTextView, action bar overflow, etc. — will be insecure. You can fix the Dialog problem by calling getWindow() on it and setting FLAG_SECURE. The rest... gets tricky. See this blog post for more.

    0 讨论(0)
  • 2020-11-22 08:22

    The solution provided by CommonsWare continues to be valid also in Lollipop.

    Just a note, if you want to continue to not see snapshots in recent list for the entire app, ALL the implemented activities should specify in the onCreate() method the flag getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE); before setContentView();

    Otherwise a snapshot in the recent list will show the first activity without the flag if the user navigated through it.

    0 讨论(0)
  • 2020-11-22 08:27

    Here is a solution for hiding content of an app by covering it with a splash screen when the app is put into the background. This is not using the FLAG_SECURE technique, I simply override the onPause and onResume methods of the screens and modify the view to show one that covers everything in the back.

    https://stackoverflow.com/a/52976001/6686912

    0 讨论(0)
  • 2020-11-22 08:31
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,
                WindowManager.LayoutParams.FLAG_SECURE);
    

    this worked for me, it prevents from taking screenshot and also any inbuilt or third party recording application from recording screen.

    0 讨论(0)
  • 2020-11-22 08:31

    This is work for me after adding these line into the onCreate before setContentView of every activity.

    getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,     
    WindowManager.LayoutParams.FLAG_SECURE);
    setContentView(R.layout.activity_notification);
    
    0 讨论(0)
  • 2020-11-22 08:40

    Be careful about using WindowManager.LayoutParams.FLAG_SECURE, on some devices (verified on Samsung Galaxy ACE, e.g. GT-S5830) this will make the view scrambled. Looks like a Samsung specific bug. I recommend the following:

    if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
    }
    

    This is what a scrambled screen looks like:

    Scrambled Screen Image

    This is working properly on ICS Samsung phones though, so I'm assuming problem is isolated to Gingerbread devices (or older).

    0 讨论(0)
提交回复
热议问题