0

I am trying to take multiple images but the ImageAvailabeListener function is not moving forward. I guess it is waiting for next image. I tried aquireNextImage() but it is also not working.

I'm taking images while MediaProjection.

  private class ImageAvailableListener implements ImageReader.OnImageAvailableListener {
        @Override
        public void onImageAvailable(ImageReader reader) {
            Image image = null;
            FileOutputStream fos = null;
            bitmap = null;
            try {
                image = mImageReader.acquireLatestImage();
                if (image != null) {
                    Log.d("servicecheck", "not null image" + image);

                    Image.Plane[] planes = image.getPlanes();
                    ByteBuffer buffer = planes[counter].getBuffer();
                    int pixelStride = planes[counter].getPixelStride();
                    int rowStride = planes[counter].getRowStride();
                    counter++;
                    int rowPadding = rowStride - pixelStride * mWidth;

                    // create bitmap
                    bitmap = Bitmap.createBitmap(mWidth + rowPadding / pixelStride, mHeight, Bitmap.Config.ARGB_8888);
                    bitmap.copyPixelsFromBuffer(buffer);

                    // fix the extra width from Image
                    Bitmap croppedBitmap;
                    try {
                        croppedBitmap = Bitmap.createBitmap(bitmap, 0, 0, mWidth, mHeight);
                    } catch (OutOfMemoryError e) {
                        croppedBitmap = bitmap;
                    }
                    if (croppedBitmap != bitmap) {
                        bitmap.recycle();
                    }

                    // write bitmap to a file
                    storeDirectory = new File(mStoreDir);
                    storeDirectory.mkdir();

                    fos = new FileOutputStream(storeDirectory.getAbsolutePath() + "/myscreen_" +             Calendar.getInstance().getTime() + ".png");
                    croppedBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);


                    //IMAGES_PRODUCED++;
                    fos.flush();
                    fos.close();
                    stopProjection();
                    stopSelf();
                    scanFile(getApplicationContext(), Uri.fromFile(storeDirectory));

                } else {
                    Log.d("servicecheck", "null image" + image);

                }

            } catch (Exception e) {
                if (bitmap != null) {
                    bitmap.recycle();
                }
                e.printStackTrace();
            }
        }
    }

//In the below function I have created set maxImages to 5(more than 1)

@SuppressLint("WrongConstant")
private void createVirtualDisplay() {


    mImageReader = ImageReader.newInstance(mWidth, mHeight, PixelFormat.RGBA_8888, 20);
    mVirtualDisplay = mMediaProjection.createVirtualDisplay(SCREENCAP_NAME, mWidth, mHeight,
            mDensity, getVirtualDisplayFlags(), mImageReader.getSurface(), null, null);
    mImageReader.setOnImageAvailableListener(new ImageAvailableListener(), null);
}

0 Answers0