android mediaprojection屏幕截图包含黑框

我正在按照以下方式使用MediaProjection录制我的屏幕

Display display = getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(size); displayWidth = size.x; displayHeight = size.y; imageReader = ImageReader.newInstance(displayWidth, displayHeight, ImageFormat.JPEG, 5); int flags = DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY | DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC; DisplayMetrics metrics = getResources().getDisplayMetrics(); int density = metrics.densityDpi; mediaProjection.createVirtualDisplay("test", displayWidth, displayHeight, density, flags, imageReader.getSurface(), null, projectionHandler); Image image = imageReader.acquireLatestImage(); byte[] data = getDataFromImage(image); Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); 

问题是捕获的图像包含下面的黑色框架。

在这里输入图像说明

编辑

上述问题可以通过位图操作来解决。

但是,我现在正在寻找一个解决scheme,可以应用于MediaProjectionImageReader SurfaceView来实现设备logging。

  • 无需使用媒体提取器,无法在Android 4.2上对video进行低级解码
  • 如何录制更好的质量在Android的audio文件?
  • 无法在iOS 5+中播放来自Android的录制audio文件
  • Android Mediarecorderlogging的video持续时间与预期持续时间不同
  • 无法在不使用媒体提取器的情况下对Android 4.2上的video进行低级解码
  • Android Media Recorder不在Google Glass上录制长video
  • Android相机预览callback和录像机录制video
  • 如何将通过MediaRecorder录制的video长度读取到通过context.getFilesDir()构build的私有应用程序存储目录中?
  • 如果您自己无法控制图像,则可以通过执行类似的操作来对其进行修改,假设您的位图被称为图像。

     Bitmap imageWithBG = Bitmap.createBitmap(image.getWidth(), image.getHeight(),image.getConfig()); // Create another image the same size imageWithBG.eraseColor(Color.BLACK); // set its background to white, or whatever color you want Canvas canvas = new Canvas(imageWithBG); // create a canvas to draw on the new image canvas.drawBitmap(image, 0f, 0f, null); // draw old image on the background image.recycle(); 

    根据你的意见,我认为这是你在找什么

      Bitmap bitmap; //field Bitmap croppedBitmap; // field Image image;// field Handler mHandler; //field new Thread() { @Override public void run() { Looper.prepare(); mHandler = new Handler(); Looper.loop(); } }.start(); imageAvailableListener = new ImageReader.OnImageAvailableListener { @Override public void onImageAvailable(ImageReader reader) { try { image = reader.acquireLatestImage(); bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); Rect rect = image.getCropRect(); croppedBitmap = Bitmap.createBitmap(bitmap,rect.left,rect.top,rect.width(),rect.height()); \\Do whatever here... image.close(); } catch (Exception e) { e.printStackTrace(); } finally { if (bitmap!=null) { bitmap.recycle(); } if (croppedBitmap!=null) { bitmap.recycle(); } if (image!=null) { image.close(); } } } } imageReader.setOnImageAvailableListener(imageAvailableListener, mHandler); 

    我有一个类似的问题。 下面的代码展示了这个问题。

     final DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); final int width = metrics.widthPixels; final int height = metrics.heightPixels; final int densityDpi = metrics.densityDpi; final int MAX_IMAGES = 10; mImageReader = ImageReader.newInstance(width, height, PixelFormat.RGBA_8888, MAX_IMAGES); mVirtualDisplay = mMediaProjection.createVirtualDisplay("ScreenCaptureTest", width, height, densityDpi, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, mImageReader.getSurface(), null, null); 

    取代这个:

     getWindowManager().getDefaultDisplay().getMetrics(metrics); 

    有了这个:

     getWindowManager().getDefaultDisplay().getRealMetrics(metrics); 

    修复它。 问题是,图像周围的装饰会破坏屏幕的实际分辨率。 getMetrics()返回一个不是精确的高度(或横向宽度),并且减去了home,back等等button。 开发人员可用的实际显示区域是(1440 x 2326 …或类似的东西)。 但是,当然,捕获的图像将是完整的1440 X 2560屏幕分辨率。