首页 > 编程知识 正文

android禁止截屏和录屏,android录屏软件的实现

时间:2023-05-05 20:13:58 阅读:265429 作者:880

Android实现录屏和截屏功能 1. MediaProjectionManager介绍2.所需权限3.示例代码

1. MediaProjectionManager介绍

用于获取screen capture的主要类,在Android 5.0(Api Level 21)时添加。
核心方法:
(1)创建:public Intent createScreenCaptureIntent ()

Returns an Intent that must be passed to startActivityForResult() in order to start screen capture. The activity will prompt the userwhether to allow screen capture. The result of this activity should be passed to getMediaProjection.

(使用时会弹出授权弹窗,只有用户授权后才能使用)

(2)获取:public MediaProjection getMediaProjection (int resultCode,
Intent resultData)

Retrieve the MediaProjection obtained from a succesful screen capture request. Will be null if the result from the startActivityForResult() is anything other than RESULT_OK.

2.所需权限 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.RECORD_AUDIO" /> 3.示例代码 MediaProjectionManager mediaProjectionManager; int width, height, dpi; private void startScreenShot(String account) { WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE); if (windowManager != null) { DisplayMetrics displayMetrics = new DisplayMetrics(); windowManager.getDefaultDisplay().getMetrics(displayMetrics); width = displayMetrics.widthPixels; height = displayMetrics.heightPixels; dpi = displayMetrics.densityDpi; } mediaProjectionManager = (MediaProjectionManager) getSystemService(MEDIA_PROJECTION_SERVICE); if (mediaProjectionManager != null) { startActivityForResult(mediaProjectionManager.createScreenCaptureIntent(), 10086); } }

说明:

int width, height, dpi 等数据在保存截屏时有用,所以先初始化。真正的启动:startActivityForResult(mediaProjectionManager.createScreenCaptureIntent(), 10086);紧接着就是在onActivityResult里获取MediaProjection即可,请往下看。 protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); MediaProjection mediaProjection = mediaProjectionManager.getMediaProjection(resultCode, data); ImageReader imageReader = ImageReader.newInstance(width, height, PixelFormat.RGBA_8888, 3); mediaProjection.createVirtualDisplay("screen_shot", width, height, dpi, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, imageReader.getSurface(), null, null); imageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() { @Override public void onImageAvailable(ImageReader reader) { Image image = reader.acquireNextImage();//获取下一帧截屏,这里可以控制你是否要单个或者直接录屏 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); if (bitmap != null) { try { // 获取内置SD卡路径 String sdCardPath = Environment.getExternalStorageDirectory().getPath(); // 图片文件路径 String filePath = sdCardPath + File.separator + "screenshot.png"; File file = new File(filePath); FileOutputStream fos = new FileOutputStream(file); bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos); fos.flush(); fos.close(); } catch (Exception e) {} } else {} image.close(); } }, null); }

说明

ImageReader说明,ImageReader这个类被允许直接从Surface接收渲染的图像数据。简单来说,它就是能直接能接受屏幕上的图像渲染数据。

The ImageReader class allows direct application access to image data rendered into a Surface

ImageReader.newInstance(int width, int height, int format, int maxImages) 创建新的reader以获取期望的size和format的Images.上述代码写的获取3张,就是ImageReader的队列最多缓存三张屏幕实时截图。Image image = imageReader.acquireNextImage();从ImageReader的队列中获取下一帧Image,如果没有新的则返回null。不过推荐我们使用acquireLatestImage来代替使用此方法。因为它会自动帮我们close掉旧的Image,并且能让效率比较差的情况下能获取到最新的Image。acquireNextImage更推荐在批处理或者后台程序中使用。拿到Image类后,就可以将获取ByteBuffer,存储成图片,这样截图当前屏幕数据就完成,录屏的道理也一样,因为视频也是一帧一帧图片组成。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。