Android 10.0版本在截屏方面做了一些改进和优化,使得截屏更加方便和高效。在Android 10.0版本中,可以使用多种方式实现截屏,其中包括使用系统快捷键、使用手势操作、调用API等。
Android 10.0版本中,截屏的流程大致如下:
触发截屏操作:用户可以通过系统快捷键或手势操作来触发截屏操作。
截屏执行:截屏操作被系统捕获并执行。系统会调用媒体框架服务来截取屏幕内容并生成截屏图像。
通知用户截屏结果:系统会通过通知栏通知用户截屏已完成,并提供分享、编辑、保存等操作选项。
存储截屏图像:用户可以选择保存截屏图像到本地存储或云端存储。
为了支持更高质量的截屏操作,Android 10.0版本还对截屏过程中的像素支持做出了改进,支持了更高质量的RGBA_8888像素格式。同时,Android 10.0版本还对现有的截屏API做了优化,通过MediaProjection API和ImageReader类等提供了更灵活、更高效的截屏解决方案。
Android 10.0版本中,截屏的触发方式包括:
使用系统的截屏快捷键:用户可以通过同时按下“电源键”和“音量下键”来实现截屏操作。
使用手势操作:用户可以通过在屏幕上进行特定的手势操作来触发截屏操作。
截屏流程大致如下:
用户发起截屏操作,系统捕获截屏触发事件并进入截屏模式。
系统从屏幕缓冲区中读取图像数据并转换成Bitmap对象。
系统将Bitmap对象进行压缩和存储,最终生成截屏图片并保存在指定目录中。
系统通过通知栏提示用户截屏已完成,提供编辑、分享、保存等操作选项。
Android 10.0版本新增了RGBA_8888像素格式,支持更高质量的截屏操作。此外,仍然支持RGBA_4444和RGB_565两种像素格式。
其中,RGBA_8888像素格式的优势在于可以支持4字节的透明度信息,可以更好地表达不同颜色及透明度混合的效果,同时对于图像处理和编辑等高精度应用也更为适合。
Android 10.0版本中,支持以下文件格式及存储方式:
PNG格式:PNG格式的截屏图片具有高质量和无损压缩等特点,适合用于保存对图像质量有严格要求的场景。
JPEG格式:JPEG格式的截屏图片具有良好的压缩性能,适合用于保存对文件大小有要求的场景。
HEIF格式:HEIF格式是Android 10.0新增支持的一种高效的图像格式,能够在减小文件大小的同时保持高质量。
此外,Android 10.0版本的截屏支持将截屏文件保存在本地存储或云端存储中。
在Android 10.0版本中,对于屏幕旋转时的截屏需要进行特殊处理,避免旋转过程中出现不同步现象。同时,对于悬浮球等特殊场景的截屏,也需要进行特殊处理,确保截屏数据的完整和准确。此外,由于不同厂商的系统可能会存在差异,需要对不同厂商的系统做出相应的适配处理。
在Android 10.0版本中,可以通过MediaProjection API来实现在应用中调用Android 10.0截屏功能,具体实现步骤如下:
MediaProjectionManager mMediaProjectionManager =
(MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE) {
if (resultCode == RESULT_OK) {
mMediaProjection = mMediaProjectionManager.getMediaProjection(resultCode, data);
startCapture();
}
}
}
private void startCapture() {
DisplayMetrics metrics = getResources().getDisplayMetrics();
int density = metrics.densityDpi;
int width = metrics.widthPixels;
int height = metrics.heightPixels;
mImageReader = ImageReader.newInstance(width, height, PixelFormat.RGBA_8888, 1);
mVirtualDisplay = mMediaProjection.createVirtualDisplay(
"ScreenCapture", width, height, density,
DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
mImageReader.getSurface(), null, null);
}
Image image = mImageReader.acquireLatestImage();
if (image != null) {
int width = image.getWidth();
int height = image.getHeight();
final Image.Plane[] planes = image.getPlanes();
final ByteBuffer buffer = planes[0].getBuffer();
int pixelStride = planes[0].getPixelStride();
int rowStride = planes[0].getRowStride();
int rowPadding = rowStride - pixelStride * width;
Bitmap bitmap = Bitmap.createBitmap(
width + rowPadding / pixelStride, height,
Bitmap.Config.ARGB_8888);
bitmap.copyPixelsFromBuffer(buffer);
bitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height);
image.close();
//TODO 对截屏图像进行处理
}
除了使用MediaProjection API外,在Android 10.0版本中还可以使用ImageReader类来实现截屏功能。具体实现步骤如下:
ImageReader mImageReader = ImageReader.newInstance(width, height, PixelFormat.RGBA_8888, 1);
Surface mSurface = mImageReader.getSurface();
VirtualDisplay mVirtualDisplay = mMediaProjection.createVirtualDisplay(
"ScreenCapture", width, height, density,
DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
mSurface, null, null);
Image image = mImageReader.acquireLatestImage();
if (image != null) {
int width = image.getWidth();
int height = image.getHeight();
final Image.Plane[] planes = image.getPlanes();
final ByteBuffer buffer = planes[0].getBuffer();
int pixelStride = planes[0].getPixelStride();
int rowStride = planes[0].getRowStride();
int rowPadding = rowStride - pixelStride * width;
Bitmap bitmap = Bitmap.createBitmap(
width + rowPadding / pixelStride, height,
Bitmap.Config.ARGB_8888);
bitmap.copyPixelsFromBuffer(buffer);
bitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height);
image.close();
//TODO 对截屏图像进行处理
}