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 ...
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()
Step 2:
Call the above method before image.close() into onImageAvailable