본문 바로가기

Android

api level 28 에서 getDrawingCache 가 deprecated 되었다.

view 를 캡쳐할때 사용하던 api 였는데 api level 28 부터는 deprecated 되서 대체할 만한게 무엇인지 찾아보다가

PixelCopy 또는 view 자체를 canvas 에 그리는 방법 이렇게 두 가지의 선택권이 있는걸로 인지 했고
PixelCopy 의 경우 최신 버전에서만 사용할 수 있다보니 당장 사용하기는 애매한 감이 있어 view 에 canvas 를 그려 capture 하는 식으로 하는걸로 결정 했다.

그렇게 나온 코드는 아래와 같고
public static void capture(@NonNull ScreenshotParams params) {
        final View view = params.view;
        final int w     = view.getWidth();
        final int h     = view.getHeight();

        view.clearFocus();
        view.setPressed(false);
        view.invalidate();

        final Bitmap buffer = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        final Canvas canvas = new Canvas(buffer);
        final Bitmap watermark = params.waterMark;

        view.draw(canvas);

        if (watermark != null) {
            final Canvas watermarkCanvas = new Canvas(buffer);
            final int offsetx = w - watermark.getWidth();
            final int offsety = h - watermark.getHeight();

            canvas.drawBitmap(watermark, offsetx, offsety, new Paint());
        }

        String savePath;
        if (TextUtils.isEmpty(params.resourcePath)) {
            savePath = mConfigDelegate.getConfig(IConfigDelegate.SCREENSHOT_PATH);
        } else {
            savePath = params.resourcePath;
        }

        File fp = new File(savePath);
        if (!fp.exists()) {
            fp.mkdirs();
        }

        File bmpFp = new File(savePath, params.fileName);
        try {
            OutputStream os = new FileOutputStream(bmpFp);
            buffer.compress(Bitmap.CompressFormat.PNG, 90, os);
            os.close();

            if (mLog.isDebugEnabled()) {
                mLog.debug("SCREENSHOT PATH : " + bmpFp.getAbsolutePath());
            }

            if (params.listener != null) {
                params.listener.onResult(OnResultListener.TRUE, bmpFp.getAbsolutePath());
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();

            if (params.listener != null) {
                params.listener.onResult(OnResultListener.FALSE, e.getMessage());
            }
        } catch (IOException e) {
            e.printStackTrace();

            if (params.listener != null) {
                params.listener.onResult(OnResultListener.FALSE_2, e.getMessage());
            }
        } finally {
            buffer.recycle();

            if (watermark != null) {
                watermark.recycle();
            }
        }
    }


혹시 모르니 PixcelCopy 의 구현 부분도 대략적 코드를 남긴다.


    private static void capturePixelCopy(@NonNull ScreenshotParams params) {
//        int offsetX = w - waterMark.getWidth();
//        int offsetY = h - waterMark.getHeight();

//        Window window = ((Activity) view.getContext()).getWindow();
//
//        view.clearFocus();
//        view.setPressed(false);
//
//        Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
//        int[] windowSize = new int[2];
//
//        view.getLocationInWindow(windowSize);
//
//        try {
//            PixelCopy.request(window, new Rect(windowSize[0], windowSize[1],
//                            windowSize[0] + view.getWidth(),
//                            windowSize[1] + view.getHeight()),
//                    bitmap, copyResult -> {
//                        if (copyResult == PixelCopy.SUCCESS) {
//
//                        }
//                    }, new Handler());
//        } catch (Exception e) {
//            mLog.error("ERROR: " + e.getMessage());
//        }
    }

'Android' 카테고리의 다른 글

android studio 3.2 업데이트  (0) 2018.10.25
ndk 그리고 cmake  (0) 2018.09.13
CLEARTEXT communication to `domain` not permitted by network security policy  (0) 2018.09.06
Failed to find byte code for $classPath  (0) 2018.09.06
android x  (0) 2018.08.31