Android 모 바 일 화면 캡 처 두 가지 실현 방법
최근 개발 과정 에서 화면 을 캡 처 하여 그림 으로 저장 해 야 하 는 수요 가 생 겼 습 니 다.구체 적 으로 웹 뷰 의 보 기 를 캡 처 하여 그림 을 저장 해 야 합 니 다.
방법 1:먼저 생각 나 는 아 이 디 어 는 SDK 가 제공 하 는 View.getDrawingCache()방법 을 이용 하 는 것 입 니 다.
public void printScreen(View view) {
String imgPath = "/sdcard/test.png";
view.setDrawingCacheEnabled(true);
view.buildDrawingCache();
Bitmap bitmap = view.getDrawingCache();
if (bitmap != null) {
try {
FileOutputStream out = new FileOutputStream(imgPath);
bitmap.compress(Bitmap.CompressFormat.PNG, 100,
out);
} catch (Exception e) {
e.printStackTrace();
}
}
}
이 방법 은 많은 상황 에서 문제 가 없다.예 를 들 어 imageview,TextView,심지어 otherview.getRootView()를 캡 처 하 는 것 이다.모두 문제 가 없 지만 웹 뷰 에 서 는 웹 뷰 의 부분 이 페이지 에 없 는 일부 내용 을 캡 처 하 는 경우 가 발생 합 니 다.예 를 들 어 웹 뷰 로 이https://miqt.github.io/jellyfish/화면 을 열 면 캡 처 한 그림 에 문제 가 생 길 수 있 습 니 다.구체 적 으로 웹 페이지 에서 움 직 이 는 해파리 가 캡 처 한 그림 에 나타 나 지 않 은 것 으로 나 타 났 습 니 다.방법 2:Android 시스템 에서 제공 하 는 서비스 Context.MEDIA 사용PROJECTION_SERVICE,캡 처 작업 진행.
데모 소스 코드:https://github.com/miqt/CapWindow
키 부분 코드 해석:↓
캡 처 요청 보 내기
final MediaProjectionManager projectionManager = (MediaProjectionManager)
getSystemService(Context.MEDIA_PROJECTION_SERVICE);
Intent intent = projectionManager.createScreenCaptureIntent();
startActivityForResult(intent, REQUEST_CODE);
되 돌아 오 는 결 과 를 받 습 니 다:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
handleScreenShotIntent(resultCode, data);
}
private void handleScreenShotIntent(int resultCode, Intent data) {
onScreenshotTaskBegan();
final MediaProjectionManager projectionManager = (MediaProjectionManager)
getSystemService(Context.MEDIA_PROJECTION_SERVICE);
final MediaProjection mProjection = projectionManager.getMediaProjection(resultCode, data);
Point size = Utils.getScreenSize(this);
final int mWidth = size.x;
final int mHeight = size.y;
final ImageReader mImageReader = ImageReader.newInstance(mWidth, mHeight, PixelFormat
.RGBA_8888, 2);
final VirtualDisplay display = mProjection.createVirtualDisplay("screen-mirror", mWidth,
mHeight, DisplayMetrics.DENSITY_MEDIUM,
DisplayManager.VIRTUAL_DISPLAY_FLAG_PRESENTATION, mImageReader.getSurface(),
null, null);
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());
}
이 방법 은 핸드폰 을 사용 하 는 시스템 캡 처(볼 륨 아래 키+전원 키)와 유사 합 니 다.완벽 하 게 할 수 있 죠?현재 원형 화면 을 캡 처 하고 저장 방법 을 수정 하면 화면 녹화 도 할 수 있 지만 첫 번 째 방법 에 비해 인터페이스의 view 와 전혀 관계 가 없다 는 단점 이 있 습 니 다.또한 이 서 비 스 를 호출 할 때권한 확인 이 가능 한 탄 상자 가 팝 업 됩 니 다.또 이 방법 은 안 드 로 이 드 5.0 의 시스템 장치 에 만 적용 된다 는 점 에 주목 해 야 한다.요약:
한 마디 로 하면 이 두 가지 방법 은 각각 장단 점 이 있 기 때문에 사용 할 때 자신의 실제 수요 에 따라 선택 해 야 한다.
읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.