Android: Как получить кадровый буфер (скриншот) на рутированном устройстве? - PullRequest
10 голосов
/ 15 февраля 2011

Я пытался:

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");
    }

Ответы [ 3 ]

0 голосов
/ 07 августа 2011

Мне кажется, что ваша проблема в следующем знаке: >. Вы не можете перенаправить вывод, используя exec. Что вам нужно сделать, это получить выходной поток процесса (который является входным потоком для вас) и сохранить его в файл;

process = Runtime.getRuntime().exec("su -c cat /dev/graphics/fb0");
InputStream is = process.getInputStream();
...
0 голосов
/ 13 мая 2014

Это не ответ. Компания, в которой я работаю, делала это раньше, я не знаю, что они делают, но я знаю, что вы не можете получить буфер, просто используйте один метод, это зависит от аппаратной архитектуры устройств.

0 голосов
/ 07 августа 2011

Ответ заключается в том, чтобы повторить способ, которым само устройство его обрабатывает:

fb = open ("/ dev / graphics / fb0", O_RDONLY);

отметьте это

...