1.禁止截图的实现
APP的某些界面如果不希望用户能够截屏,可以对当前当前的Activity设置一个安全标记
实际上,Android 本身就提供了对应的 Api 的,使用起来也非常的简单,只需要拿到 window 对象,对其添加一个 FLAG_SECURE 的 flag 即可。
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
这里的 window 对象,可以是 Activity.getWindow() 获取的,也可以是 Dialog.getWindow() 获取的,获取 window 的方式很多,这里就不一一举例了。只是使用不同对象获取到的 Window 对象,禁用截屏的区域也不同。
大部分情况下都推荐使用这种方法,禁用掉系统截屏的功能,一劳永逸。
FLAG_SECURE 是 WindowManager.LayoutParams 的一个属性,从文档上就可以看出来,它标记当前 window 是安全的,不允许有一些非安全的操作,例如截屏功能。
在Google的过程中, 发现这个flag可以实现以下功能:
1.阻止屏幕截图
2.在Recent apps(任务切换界面)中只显示应用名字和图标, 不显示内容
3.Google App的Now on tap功能不会去分析你的页面的内容
2.截图的实现
截图工具类ScreenUtils
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Rect;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.WindowManager;
public class ScreenUtils {
private ScreenUtils() {
/* cannot be instantiated */
throw new UnsupportedOperationException("cannot be instantiated");
}
/**
* 获得屏幕高度
*
* @param context
* @return
*/
public static int getScreenWidth(Context context) {
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics outMetrics = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(outMetrics);
return outMetrics.widthPixels;
}
/**
* 获得屏幕宽度
*
* @param context
* @return
*/
public static int getScreenHeight(Context context) {
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics outMetrics = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(outMetrics);
return outMetrics.heightPixels;
}
/**
* 获得状态栏的高度
*
* @param context
* @return
*/
public static int getStatusHeight(Context context) {
int statusHeight = -1;
try {
Class<?> clazz = Class.forName("com.android.internal.R$dimen");
Object object = clazz.newInstance();
int height = Integer.parseInt(clazz.getField("status_bar_height").get(object).toString());
statusHeight = context.getResources().getDimensionPixelSize(height);
} catch (Exception e) {
e.printStackTrace();
}
return statusHeight;
}
/**
* 获取当前屏幕截图,包含状态栏
*
* @param activity
* @return
*/
public static Bitmap snapShotWithStatusBar(Activity activity) {
View view = activity.getWindow().getDecorView();
view.setDrawingCacheEnabled(true);
view.buildDrawingCache();
Bitmap bmp = view.getDrawingCache();
int width = getScreenWidth(activity);
int height = getScreenHeight(activity);
Bitmap bp = null;
bp = Bitmap.createBitmap(bmp, 0, 0, width, height);
view.destroyDrawingCache();
return bp;
}
/**
* 获取当前屏幕截图,不包含状态栏
*
* @param activity
* @return
*/
public static Bitmap snapShotWithoutStatusBar(Activity activity) {
View view = activity.getWindow().getDecorView();
view.setDrawingCacheEnabled(true);
view.buildDrawingCache();
Bitmap bmp = view.getDrawingCache();
Rect frame = new Rect();
activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
int statusBarHeight = frame.top;
int width = getScreenWidth(activity);
int height = getScreenHeight(activity);
Bitmap bp = null;
bp = Bitmap.createBitmap(bmp, 0, statusBarHeight, width, height - statusBarHeight);
view.destroyDrawingCache();
return bp;
}
}
通过调用以上工具类的截图方法就可以拿到图片的bitmap。