안드로이드 개발 질문/답변
(글 수 45,052)
화면 캡쳐에 대한 관련 게시물은 다 읽어 보았습니다.
루팅을 해야한다는게 대부분 이던데, 저도 루팅을 해서 /dev/graphics/fb0의 권한을 644 바꾸어 성공을 했습니다.
그런데 루팅을 하지않은 폰에서 플랫폼 키 사인을 가지고 해결할 수는 없을까요?
일단 저는 안드로이드 전체 소스를 빌드를 해서 예뮬레이터 환경을 만들었습니다.
루팅 폰에서 화면 캡쳐하던 NDK 라이브러리 소스를 그대로 사용을 하고,
[SharedUserID="android.uid.graphics"] 를 패니페스트에 주어 "fb0"와 같은 그룹에 속하게 하여 화면을 얻어오려 했습니다만
결과는 실패했습니다.
.apk 파일은 플랫폼 키로 사인을 했습니다.
무슨 다른 방법이 있을까요?
NDK로 짠 소스는 밑과 같습니다
루팅을 해야한다는게 대부분 이던데, 저도 루팅을 해서 /dev/graphics/fb0의 권한을 644 바꾸어 성공을 했습니다.
그런데 루팅을 하지않은 폰에서 플랫폼 키 사인을 가지고 해결할 수는 없을까요?
일단 저는 안드로이드 전체 소스를 빌드를 해서 예뮬레이터 환경을 만들었습니다.
루팅 폰에서 화면 캡쳐하던 NDK 라이브러리 소스를 그대로 사용을 하고,
[SharedUserID="android.uid.graphics"] 를 패니페스트에 주어 "fb0"와 같은 그룹에 속하게 하여 화면을 얻어오려 했습니다만
결과는 실패했습니다.
.apk 파일은 플랫폼 키로 사인을 했습니다.
무슨 다른 방법이 있을까요?
NDK로 짠 소스는 밑과 같습니다
jint func() { int width; int height; int BYTE_PER_PIXEL = 2; int SCREEN_NUM = 1; int READ_BYTE; struct fb_var_screeninfo sm_scrInfo; // open fb0 int fp = open("/dev/graphics/fb0", O_RDONLY); if (fp < 0) { return errno; } if (ioctl(fp, FBIOGET_VSCREENINFO, &sm_scrInfo)) { UTIL_debugLog("GU_initDisplay fb ioctl failed\n"); return errno; } width = (int)sm_scrInfo.xres; height = (int)sm_scrInfo.yres; READ_BYTE = width * height * BYTE_PER_PIXEL * SCREEN_NUM; // get pointer unsigned short * pFrame = NULL; pFrame = mmap(0, READ_BYTE, PROT_READ, MAP_SHARED, fp, 0); if (pFrame == MAP_FAILED) { close(fp); return errno; } // set buffer (* env)->SetByteArrayRegion(env, jByte, 0, READ_BYTE, (jbyte *)pFrame); munmap(pFrame, READ_BYTE); close(fp); return 0; }