2015-09-14 4 views
3

Можно ли отключить захват экрана из фрагмента? Я знаю, что ниже работает для класса активностиКак отключить захват экрана в фрагменте Android?

onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, 
       WindowManager.LayoutParams.FLAG_SECURE); 
} 

Но что, если у меня есть фрагмент, который показывает, на вершине деятельности. Могу ли я как-то отключить захват экрана? Я попытался установить FLAG_SECURE в методе onCreate() или onCreateView() этого фрагмента, но он не работает. Я все еще могу снять снимок экрана. Только когда я добавляю флаг в родительскую активность, я могу отключить его.

На соответствующую записку, скажем, у меня есть метод в ParentActivity.java (который расширяет активность)

public void disableScreenCapture() { 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, 
      WindowManager.LayoutParams.FLAG_SECURE); 

} 

И в моем ChildFragment.java (который проходит фрагмент)

  public void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       ParentActivity parentActivity = (ParentActivity)getActivity(); 
       parentActivity.disableScreenCapture(); //doesn't work 
     } 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
           Bundle savedInstanceState) { 
       ParentActivity parentActivity = (ParentActivity)getActivity(); 
       parentActivity.disableScreenCapture(); //doesn't work either 
    } 

Есть идеи?

Заранее спасибо

+2

Мое предположение заключается в том, что «безопасный» флаг применяется ко всему уровню пользовательского интерфейса View. Поверхность SurfaceView представляет собой отдельный слой и может обрабатываться независимо, но интерфейс просмотра представлен композицией приложения и передается системному компоновщику как единое целое. – fadden

ответ

2

Этот код работал для меня.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
    getActivity().getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE); 
    Window window = getActivity().getWindow(); 
    WindowManager wm = getActivity().getWindowManager(); 
    wm.removeViewImmediate(window.getDecorView()); 
    wm.addView(window.getDecorView(), window.getAttributes()); 

} 
+0

Ты отличный друг :) – pyus13

4

Выполнение вашего disableScreenCapture() вызова в onResume, onCreateView или onActivityAttached в вашем осколком всю работу - они сделали для меня. Выполнение этого вызова в onActivityCreated может не сработать, поскольку я считаю, что этот крючок вызывается только тогда, когда активность re -создана после ее уничтожения. Однако я этого не пробовал.

Если вы не выполняете этот звонок в onCreateView, вы на 100% уверены, что ваш Фрагмент фактически добавлен в Activity?

Для DialogFragment это немного отличается:

getDialog().getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, 
     WindowManager.LayoutParams.FLAG_SECURE); 

DialogFragment не Dialog сам по себе, но вместо этого содержит ссылку на один и шоу/отклоняет его, когда добавляется фрагмент и удаляется. Диалоги имеют свои собственные Windows и должны иметь флаг, установленный индивидуально.

+0

Что делать, если мой фрагмент простирается от фрагмента, а не от DialogFragment? – kdas

+0

О, извините, я прочитал вопрос неправильно. Проведите некоторое исследование и ответьте. – tophyr

+0

Отключение скриншота на onResume() или onActivityCreated() также не работает, в фрагменте. – kdas

Смежные вопросы