针对 Android 应用的 " 截屏攻击 " 是 恶意应用程序 或者 攻击者利用某些漏洞或技术手段 , 非法获取用户屏幕上的敏感信息 , 会导致用户 隐私泄漏 或者 造成安全风险 , 下面是常见的攻击方式 :
在 Android 系统中 , 用户可以 通过 特定的键盘组合触发 截屏 ;
通过 adb 命令截屏 :
adb shell screencap -p /sdcard/screenshot.png
adb pull /sdcard/screenshot.png /path/to/save/on/computer/
Android Studio 中的截图功能 , 就是这么实现的 ;
在 Android 应用程序中 , 通过代码进行截屏 , 需要如下几个步骤 :
View rootView = activity.getWindow().getDecorView().getRootView();
Bitmap screenshotBitmap = Bitmap.createBitmap(rootView.getWidth(), rootView.getHeight(), Bitmap.Config.ARGB_8888);
rootView.draw(new Canvas(screenshotBitmap));
代码示例 :
import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Environment;
import android.view.View;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class ScreenshotUtils {
// 截屏并保存到指定文件
public static void takeScreenshot(Activity activity) {
// 获取屏幕内容的视图
View rootView = activity.getWindow().getDecorView().getRootView();
// 创建一个空的Bitmap,大小为屏幕的宽高
Bitmap screenshotBitmap = Bitmap.createBitmap(rootView.getWidth(), rootView.getHeight(), Bitmap.Config.ARGB_8888);
// 将屏幕内容绘制到Bitmap上
rootView.draw(new Canvas(screenshotBitmap));
// 保存Bitmap到文件
saveBitmapToFile(screenshotBitmap, "screenshot.png");
}
// 将Bitmap保存到文件
private static void saveBitmapToFile(Bitmap bitmap, String fileName) {
// 获取外部存储的公共目录
File directory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
// 创建存储文件的目录
File screenshotFile = new File(directory, fileName);
FileOutputStream fos = null;
try {
fos = new FileOutputStream(screenshotFile);
// 将Bitmap压缩为PNG格式并写入文件
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
// 刷新文件输出流
fos.flush();
// 在此可以发送广播通知系统相册更新
// MediaScannerConnection.scanFile(context, new String[]{screenshotFile.getAbsolutePath()}, null, null);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
在 Activity 代码中 , 可以在调用 setContentView 函数之前 ,
为 Window 窗口对象 设置 LayoutParams.FLAG_SECURE 标志位 , 可以禁止对本界面进行截屏 ,
Window 窗口对象 , 可通过 getWindow 方法获取 ,
核心代码如下 :
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
代码示例 :
import android.app.Activity;
import android.os.Bundle;
import android.view.WindowManager.LayoutParams;
public class FlagSecureTestActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 设置 FLAG_SECURE 标志位,禁止屏幕截屏
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
// 设置布局内容
setContentView(R.layout.main);
}
}