2011-02-14 4 views
10

내가 시도 :Android : 루팅 된 기기에서 프레임 버퍼 (스크린 샷)를 어떻게 얻을 수 있습니까?

process = Runtime.getRuntime().exec("su -c cat /dev/graphics/fb0 > /sdcard/frame.raw"); 
process.waitFor(); 

그러나 그것은 작동하지 않습니다. 내 장치가 루팅 된 것입니다.

루팅 된 액세스가 필요하다는 많은 답변이 있지만 프레임 버퍼를 가져 오는 실제 코드는 없습니다.

또한 glReadPixels()을 시도했지만 운이 없었습니다.

public void TakeScreen() { 

     DisplayMetrics dm = new DisplayMetrics(); 
     getWindowManager().getDefaultDisplay().getMetrics(dm); 
     int width = dm.widthPixels; 
     int height = dm.heightPixels; 

     int screenshotSize = width * height; 
     ByteBuffer bb = ByteBuffer.allocateDirect(screenshotSize * 4); 
     bb.order(ByteOrder.nativeOrder()); 
     gl.glReadPixels(0, 0, width, height, GL10.GL_RGBA, 
       GL10.GL_UNSIGNED_BYTE, bb); 
     int pixelsBuffer[] = new int[screenshotSize]; 
     bb.asIntBuffer().get(pixelsBuffer); 
     bb = null; 
     Bitmap bitmap = Bitmap.createBitmap(width, height, 
       Bitmap.Config.RGB_565); 
     bitmap.setPixels(pixelsBuffer, screenshotSize - width, -width, 0, 0, 
       width, height); 
     pixelsBuffer = null; 

     short sBuffer[] = new short[screenshotSize]; 
     ShortBuffer sb = ShortBuffer.wrap(sBuffer); 
     bitmap.copyPixelsToBuffer(sb); 

     for (int i = 0; i < screenshotSize; ++i) { 
      short v = sBuffer[i]; 
      sBuffer[i] = (short) (((v & 0x1f) << 11) | (v & 0x7e0) | ((v & 0xf800) >> 11)); 
     } 
     sb.rewind(); 
     bitmap.copyPixelsFromBuffer(sb); 
     saveBitmap(bitmap, "/screenshots", "capturedImage"); 
    } 
+0

결국이 작업을 수행 할 수 있었습니까? 그렇다면 어떻게 공유 할 수 있습니까? – zacsek

+0

http://stackoverflow.com/questions/17304611/android-read-fb0-always-give-me-blackscreen/17331970#17331970을 참조하십시오. – fadden

답변

0

대답은 장치 자체가 복제 처리하는 방법에있다 :

FB = 개방 ("/ 디바이스/그래픽/FB0"을 O_RDONLY); > : 문제는이 기호처럼

체크 this

0

나에게 보인다. exec을 사용하여 출력을 리디렉션 할 수 없습니다. 당신이해야 할 일은 (당신을위한 입력 스트림 인) 프로세스의 출력 스트림을 잡고 파일에 저장하는 것입니다.

process = Runtime.getRuntime().exec("su -c cat /dev/graphics/fb0"); 
InputStream is = process.getInputStream(); 
... 
0

이것은 답변이 아닙니다. 내가 일하는 회사는 전에 무엇을했는지, 나는 그들이 무엇을하는지 모르지만 버퍼를 얻을 수 없다는 것을 알고있다. 하나의 방법을 사용한다. 이것은 장치의 하드웨어 아키텍처에 달려있다.

관련 문제