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());
// }
}
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 |