BufferQueue has been abandoned when using Mediaprojection

415 Views Asked by At

Does anyone know what it is? BufferQueue has been abandoned

I am using the Mediaprojectoin class to take a Screenshot. My app works well but in Logcat I have many lines that say "BufferQueue has been abandoned".I don't know What it is and what I should do.

in fact, I don't have this problem in android 5.just for android 6+.

this is my code :

  Display display = wm.getDefaultDisplay();
                // final DisplayMetrics metrics = new DisplayMetrics();
                display.getMetrics(metrics);
                Point size = new Point();
                display.getRealSize(size);
                final int mWidth = size.x;
                final int mHeight = size.y;
                int mDensity = metrics.densityDpi;

                ImageReader mImageReader  = ImageReader.newInstance(mWidth, mHeight, PixelFormat.RGBA_8888, 2);

                int flags = DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY | DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC;

                mProjection.createVirtualDisplay("screen-mirror", mWidth, mHeight, mDensity, flags, mImageReader.getSurface(), null, handler);
                mImageReader.setOnImageAvailableListener(new mImageListener(handler,metrics,mImageReader),handler);

and this is ImageListener :

class mImageListener implements ImageReader.OnImageAvailableListener{

    private Handler handler ;
    private DisplayMetrics metrics ;
    ImageReader imageReader ;
    public mImageListener(Handler handler ,DisplayMetrics metrics , ImageReader imageReader ){

        this.handler = handler ;
        this.metrics = metrics ;
        this.imageReader = imageReader ;
    }


    @Override
    public void onImageAvailable(ImageReader reader) {
        reader.setOnImageAvailableListener(null, handler);

        Image image = reader.acquireLatestImage();

        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 * metrics.widthPixels;
        // create bitmap
        Bitmap bmp = Bitmap.createBitmap(metrics.widthPixels + (int) ((float) rowPadding / (float) pixelStride), metrics.heightPixels, Bitmap.Config.ARGB_8888);
        bmp.copyPixelsFromBuffer(buffer);

        image.close();
        reader.close();

        Bitmap realSizeBitmap = Bitmap.createBitmap(bmp, 0, 0, metrics.widthPixels, bmp.getHeight());
        bmp.recycle();

        FileOutputStream fos = null;
        Bitmap bitmap = realSizeBitmap;

        try {

            File img1 = new File("/sdcard/DCIM"+"/ins.jpg" ) ;

           fos = new FileOutputStream(img1) ;
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos) ;

            Toast.makeText(getApplicationContext() ,"Screen was taken" ,Toast.LENGTH_LONG ).show();
            fos.flush();
            fos.close();
            imageReader = null ;

        }
        catch (Exception e){
            Toast.makeText(getApplicationContext() , "exception happend + " + e.toString(),Toast.LENGTH_LONG).show() ;
        }
    }


}

Can you help me ...

1

There are 1 best solutions below

0
On

Once i'd faced this issue. You need to release and stop mediaprojection. This exception could be thrown into the logcat because of asynchronous ImageReader request.

Solution:

Step 1: Make a function named releaseAll()

private void releaseAll(){
        display.release();
        mImageReader.getSurface().release();
        mImageReader.close()
        if (mProjection != null) mProjection.stop()
        mMediaProjection = null
        mImageReader = null
}

Step 2:

Call the above method before image.close() into onImageAvailable

 releaseAll();
 image.close();