Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(this)
Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
Build.VERSION.SDK_INT
:获取当前Android系统的API版本号,每个Android版本都有一个对应的API版本号,比如Android 6.0对应API 23,Android 7.0对应API 24。
Build.VERSION_CODES.M
:是Android 6.0(API 23)的标识,从Android 6.0开始,系统对悬浮窗功能进行了限制,并且要求应用必须明确请求悬浮窗权限。
意思是:判断当前手机的系统版本是否大于或等于Android 6.0。
!Settings.canDrawOverlays(this)
Settings.canDrawOverlays()
:用来判断当前应用是否拥有悬浮窗权限,参数this
表示当前应用的上下文(context)。
意思是:判断当前应用是否没有悬浮窗权限(!
表示取反,即判断是否不拥有悬浮窗权限)。
ScreenCaptureService captureService = ScreenCaptureService.getInstance();
return captureService.getCurrentFrame(); // 获取当前屏幕帧
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, bos);
输入流:用于从外部设备读取数据到程序中(类似 “从管道一端吸水”)。
输出流:用于将程序中的数据写入到外部设备(类似 “向管道另一端注水”)。
创建文件夹
String directoryPath = "C:/myfolder/subfolder";
File directory = new File(directoryPath);
boolean success = directory.mkdir();
流类型 | 存储位置 | 本质 |
---|---|---|
ByteArrayOutputStream | 内存(JVM 堆) | 将数据写入内部的字节数组缓冲区 |
FileOutputStream | 磁盘(文件系统) | 将数据直接写入磁盘上的文件 |
"Hello".getBytes() 用于将字符串转换为字节数组。 [72, 101, 108, 108, 111]
.toByteArray()
这是 ByteArrayOutputStream
类的方法,用于将流中缓存的数据一次性转为字节数组。
Bitmap.compress()
方法用于将位图(Bitmap)数据压缩为指定格式(如 JPEG、PNG)并写入输出流。
public boolean compress(
Bitmap.CompressFormat format, // 压缩格式(JPEG、PNG、WEBP)
int quality, // 压缩质量(0-100,仅对 JPEG 和 WEBP 有效)
OutputStream stream // 输出流(如文件流、字节流)
)
DisplayMetrics
是 Android 开发中用于获取屏幕显示信息的核心类,包含了屏幕尺寸、密度、分辨率等关键指标。
属性名 | 含义 |
---|---|
widthPixels | 屏幕宽度(像素) |
heightPixels | 屏幕高度(像素) |
density | 屏幕密度比例(如 1.0 代表 mdpi,1.5 代表 hdpi,2.0 代表 xhdpi) |
densityDpi | 屏幕每英寸点数(DPI,如 160、240、320) |
scaledDensity | 字体缩放比例(通常与 density 相同,除非用户手动调整了字体大小) |
xdpi / ydpi | 屏幕实际的水平 / 垂直 DPI(物理测量值) |
123
WindowManager
是 Android 系统中用于管理窗口的核心组件,负责窗口的布局、显示层级和屏幕信息获取。它是连接应用与系统窗口系统的桥梁,常用于获取屏幕尺寸、创建悬浮窗、调整窗口参数等操作。
windowManager.getDefaultDisplay().getMetrics(metrics);
getDefaultDisplay()
作用:获取默认显示器(即主屏幕)的 Display
对象。
getMetrics(metrics)
作用:将屏幕信息(如尺寸、密度)填充到传入的 DisplayMetrics
对象中。
先创建MediaProjection
然后创建VirtualDisplay
使用ImageReader,它提供了一个Surface
,可以作为VirtualDisplay
的输出目标。
设置 ImageReader 的监听器,获取最新的图片。 image = reader.acquireLatestImage();
处理图片,把图片转化成bitmap。
当你保存图片时,通常是先将Bitmap
对象转换为字节数组,然后将字节数组写入文
-
使用 Bitmap:
- 需要对图像进行编辑(如裁剪、调色)。
- 需要在 UI 上显示图像。
- 需要获取或修改像素值(如实现滤镜效果)。
-
使用字节数组:
- 需要存储图像到文件(如保存 JPEG/PNG)。
- 需要通过网络传输图像。
- 需要处理二进制数据(如加密、压缩)。
123
修饰符组合 | 访问权限 | 静态性 | 可变性 | 推荐场景 | 风险 |
---|---|---|---|---|---|
private static final | 类内部 | ✅ | ❌ | 类内部使用的常量(如配置参数) | 无 |
private static | 类内部 | ✅ | ✅ | 类内部使用的共享变量(如计数器) | 无 |
public static | 全局可见 | ✅ | ✅ | 极少使用(违反封装原则) | 破坏封装,导致代码难以维护 |
public static final | 全局可见 | ✅ | ❌ | 公开的常量(如数学常数、版本号) | 无 |