안드로이드 개발 질문/답변
(글 수 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;
}


