Android 5.0 화면 캡처 Image image = imageReader.acquireNextImage() 공백 포인터 솔루션

3160 단어
Image image = imageReader.acquireNextImage(); 캡처할 때 이 말은 빈 포인터(왜 나는 항상 빈 포인터 봉에 있는가)를 표시한다. 왜냐하면 캡처 데이터를 읽으면 대상의 창설이 완료되는 데 일정한 시간이 걸리기 때문이다. 창설 대상부터 그림 데이터까지 진정으로 사용할 수 있는 방법은 OnImage Available Listener의 리셋 방법에서 완성해야 한다.
mImageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {
            @Override
            public void onImageAvailable(ImageReader mImageReader) {

                Image image = null;
                try {
                    image = mImageReader.acquireLatestImage();
                    if (image != null) {
                        final Image.Plane[] planes = image.getPlanes();
                        if (planes.length > 0) {
                            final ByteBuffer buffer = planes[0].getBuffer();
                            int pixelStride = planes[0].getPixelStride();
                            int rowStride = planes[0].getRowStride();
                            int rowPadding = rowStride - pixelStride * mWidth;


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

                            Bitmap croppedBitmap = Bitmap.createBitmap(bmp, 0, 0, mWidth, mHeight);

                            saveBitmap(croppedBitmap);//    

                            if (croppedBitmap != null) {
                                croppedBitmap.recycle();
                            }
                            if (bmp != null) {
                                bmp.recycle();
                            }
                        }
                    }

                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    if (image != null) {
                        image.close();
                    }
                    if (mImageReader != null) {
                        mImageReader.close();
                    }
                    if (display != null) {
                        display.release();
                    }

                    mImageReader.setOnImageAvailableListener(null, null);
                    mProjection.stop();

                    onScreenshotTaskOver();
                }

            }
        }, getBackgroundHandler());

그렇습니다. 많은 곳에서 getBackgroundHandler라는 handler의 사용 방식을 제시하지 않았기 때문에 참고 사이트 [1]에서 저자의 원본 코드를 벗겼습니다.
//          
    Handler backgroundHandler;

    private Handler getBackgroundHandler() {
        if (backgroundHandler == null) {
            HandlerThread backgroundThread =
                    new HandlerThread("catwindow", android.os.Process
                            .THREAD_PRIORITY_BACKGROUND);
            backgroundThread.start();
            backgroundHandler = new Handler(backgroundThread.getLooper());
        }
        return backgroundHandler;
    }

포맷 같은 건 나중에 얘기할게요.
참조: 1,http://www.tk4479.net/SpringIOC/article/details/78568438 2、https://github.com/miqt/CapWindow

좋은 웹페이지 즐겨찾기