Android如何实现截屏功能
发表于:2025-11-13 作者:千家信息网编辑
千家信息网最后更新 2025年11月13日,本文小编为大家详细介绍"Android如何实现截屏功能",内容详细,步骤清晰,细节处理妥当,希望这篇"Android如何实现截屏功能"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知
千家信息网最后更新 2025年11月13日Android如何实现截屏功能
本文小编为大家详细介绍"Android如何实现截屏功能",内容详细,步骤清晰,细节处理妥当,希望这篇"Android如何实现截屏功能"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
介绍
Android 5.0以后开放的录屏API,取视频中的一帧数据,这样就可以实现截屏
步骤
在activity中授权,在service中完成初始化并截图,当然可以后台定时截图,但是6.0系统会有内存溢出的bug
1:build.gradle
compileSdkVersion 21 buildToolsVersion "27.0.3" defaultConfig { applicationId "com.aile.screenshot" multiDexEnabled true minSdkVersion 21 targetSdkVersion 21 versionCode 1 versionName "1.0" }2:在activity中授权
public void requestCapturePermission() { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { return; } MediaProjectionManager mediaProjectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE); startActivityForResult(mediaProjectionManager.createScreenCaptureIntent(), REQUEST_MEDIA_PROJECTION); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case REQUEST_MEDIA_PROJECTION: if (resultCode == RESULT_OK && data != null) { Service.setResultData(data); startService(new Intent(this, Service.class)); finish(); } break; } }3:在service中初始化ImageReader,MediaProjection
private void createImageReader() { mImageReader = ImageReader.newInstance(mScreenWidth, mScreenHeight, PixelFormat.RGBA_8888, 1); } public void setUpMediaProjection() { mMediaProjection = getMediaProjectionManager().getMediaProjection(Activity.RESULT_OK, mResultData); } }4:在service中完成截图重要步骤:
private void startScreenShot() { Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { startVirtual(); } }, 0); handler.postDelayed(new Runnable() { @Override public void run() { startCapture(); } }, 50); } public void startVirtual() { if (mMediaProjection != null) { virtualDisplay(); } else { setUpMediaProjection(); virtualDisplay(); } } private void virtualDisplay() { mVirtualDisplay = mMediaProjection.createVirtualDisplay("screen-mirror", mScreenWidth, mScreenHeight, mScreenDensity, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, mImageReader.getSurface(), null, null); }//异常处理的核心private void startCapture() { Image image = null; try { image = mImageReader.acquireLatestImage(); } catch (IllegalStateException e) { if (null != image) { image.close(); image = null; image = mImageReader.acquireLatestImage(); } } if (image == null) { startScreenShot(); } else { SaveTask mSaveTask = new SaveTask(); AsyncTaskCompat.executeParallel(mSaveTask, image); new Handler().postDelayed(new Runnable() { @Override public void run() { stopVirtual(); tearDownMediaProjection(); } }, 0); } }public class SaveTask extends AsyncTask { @Override protected Bitmap doInBackground(Image... params) { if (params == null || params.length < 1 || params[0] == null) { return null; } Image image = params[0]; 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(); return bitmap; } @Override protected void onPostExecute(final Bitmap bitmap) { super.onPostExecute(bitmap); //处理bitmap的业务代码 } 5:Bitmap转IS流,指定区域截图
// 将Bitmap转换成InputStream ByteArrayOutputStream bos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, bos); InputStream inputStream = new ByteArrayInputStream(bos.toByteArray());//指定区域截图 Rect mRect = new Rect(51, 74, 58, 62); BitmapRegionDecoder bitmapRegionDecoder = BitmapRegionDecoder.newInstance(inputStream, true); Bitmap bm = bitmapRegionDecoder.decodeRegion(mRect, null);
6:定时任务的处理
private Timer timer = new Timer(); public void shootByTime() { final Handler handler = new Handler() { @Override public void handleMessage(Message msg) { startScreenShot(); super.handleMessage(msg); } }; timer.schedule(new TimerTask() { @Override public void run() { Message message = new Message(); message.what = 1; handler.sendMessage(message); } }, 0, 100); }7:横竖屏的处理
@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (newConfig.orientation == this.getResources().getConfiguration().ORIENTATION_PORTRAIT) { mRect = new Rect(51, 775, 745, 47); } else if (newConfig.orientation == this.getResources().getConfiguration().ORIENTATION_LANDSCAPE) { mRect = new Rect(54, 24, 545, 45); } }读到这里,这篇"Android如何实现截屏功能"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。
截图
处理
功能
文章
步骤
内容
区域
妥当
重要
业务
代码
任务
内存
后台
就是
思路
数据
新知
更多
核心
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
国家哲学科学期刊数据库
网络安全常知识
软件开发实训周记200字
xml存数据库
网络安全知识宣传教育目的
大学生 网络安全 对策
家用计算机网络安全措施
安车数据库密码
数据库中精准小数类型
什么样的软件开发是高新技术
服务器 iis管理器
大凌通网络技术
服务器安全狗攻击日志
数据库代码多用大写
互联网 高科技农业发展前景
内蒙古网络安全问题
做软件开发需要ICP吗
电视keep显示与服务器断开
xsd文件 数据库
查看gerrit 数据库
qq传输文件会在服务器保留吗
安全监控数据库
组织研究网络安全年度工作
国土空间规划数据库质量检查软件
软件开发的好处和坏处
otn软件开发
网络安全工作的廉政风险点
网络安全钥匙框弹不出来
芯片软件开发什么意思
传统软件开发工程师