BufferQueue был отменен при использовании Mediaprojection - PullRequest
1 голос
/ 18 марта 2020

Кто-нибудь знает, что это? BufferQueue был отменен

Я использую класс Mediaprojectoin для создания снимка экрана. Мое приложение работает хорошо, но в Logcat у меня есть много строк с надписью «BufferQueue был заброшен». Я не знаю, что это такое и что мне делать. На самом деле

У меня нет этой проблемы в android 5.просто для android 6 +.

это мой код:

  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);

и это 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() ;
        }
    }


}

Можете ли вы помоги мне ...

...