화면 캡쳐에 대한 관련 게시물은 다 읽어 보았습니다.

루팅을 해야한다는게 대부분 이던데, 저도 루팅을 해서 /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;
}