備忘録 〜プログラミング〜

プログラミングに関する事をつらつらと、、

Androidアプリでキャプチャーをされたくないときにする方法

Android 4.4からデバイス画面を直接キャプチャー出来るようになり、コンテンツの保護対応をする必要が出ました。
DeNAが最近リリースしたMirrativというアプリでキャプチャーされないようにしたい場合など有効なtipsになるかと思います。

1: キャプチャーしたくないActivityにFLAG_SECUREを設定する方法(SamppleActivity.java)

@Override 
public onCreate(Bundle savedInstanceState){
  super.onCreate(savedInstanceState);
  //FLAG_SECUREの設定
  getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,
        WindowManager.LayoutParams.FLAG_SECURE);
}

2: キャプチャーしたくないFragmentにFLAG_SECUREを設定する方法(SampleFragment.java)

WindowManager mWindowManager;
FrameLayout mLayoutView;
WindowManager.LayoutParams mParams;

@Override
public onCreate(Bundle savedInstanceState){
  super.onCreate(savedInstanceState);
  mParams = new WindowManager.LayoutParams(
          WindowManager.LayoutParams.TYPE_SYSTEM_OVERRAY,
          WindowManager.LayoutParams.FLAG_SECURE,
          PixelFormat.TRANSLUCENT);
  mWindowManager = (WindowManager) getActivity().getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
  mLayoutView = new FrameLayout(getActivity);
  mWindowManager.addView(mLayoutView, mParams);
}

@Override
public void onHiddenChanged(boolean hidden){
  super.onHIddenChanged(hidden);
  if(hidden){
    mWindowManager.removeView(mLayoutView);
  } else {
    mWindowManager.addView(mLayoutView, mParams);
  }
}

3: キャプチャーしたくないDialogFragmentにFLAG_SECUREを設定する方法(SampleDialogFragment.java)

@Override
public Dialog onCreateDialog(Bundle savedInstanceState){
  Dialog dialog = new Dialog(getActivity(), R.style.sample_dialog);
  setCancelable(true);
  dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,
          WindowManager.LayoutParam.FLAG_SECURE);
  return dialog;
}

4: キャプチャーしたくないSurfaceViewにsetSecure(boolean isSecure)で設定する方法(SampleSurfaceView.java)

public SampleSurfaceView(){
  if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){
    setSecure(true);
  }
}

実装当初は、ActivityのみにFLAG_SECUREを設定していたので、Dialogでは表示されてしまったり、SurfaceViewを使用して動画を再生している部分で端末が横向きになったときにキャプチャーされてしまう問題などが色々と出てしまったのですが、ほぼほぼ上記の対応で大丈夫でした。

参考URL:
【ActivityにFLAG_SECURE】
Y.A.M の 雑記帳: Android アプリからスクリーンキャプチャを無効にする方法

【FlagmentにFLAG_SECURE】dev.classmethod.jp

【DialogにFLAG_SECURE】
http://my.fit.edu/~vkepuska/ece5570/adt-bundle-windows-x86_64/sdk/samples/android-17/ApiDemos/src/com/example/android/apis/app/SecureDialogActivity.java

【SurfaceViewにsetSecure】
SurfaceView | Android Developers