Android源代码无法运行,通过glReadPixels读取帧缓冲区。

5

我刚开始学习Android开发,现在有一个任务需要在指定的时间间隔后读取帧缓冲区数据。

我编写了以下代码:

public class mainActivity extends Activity {
    Bitmap mSavedBM;
    private EGL10 egl;
    private EGLDisplay display;
    private EGLConfig config;    
    private EGLSurface surface;
    private EGLContext eglContext;
    private GL11 gl;
    protected int width, height;


 //Called when the activity is first created. 
@Override
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);

    // get the screen width and height
    DisplayMetrics dm = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(dm);
    int screenWidth = dm.widthPixels;
    int screenHeight = dm.heightPixels; 

    String SCREENSHOT_DIR = "/screenshots";
    initGLFr(); //GlView initialized.
    savePixels( 0, 10, screenWidth, screenHeight, gl); //this gets the screen to the mSavedBM.
    saveBitmap(mSavedBM, SCREENSHOT_DIR, "capturedImage");

    //Now we need to save the bitmap (the screen capture) to some location.
    setContentView(R.layout.main); //This displays the content on the screen

}
private void initGLFr()
{
    egl = (EGL10) EGLContext.getEGL();
    display = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
    int[] ver = new int[2];
    egl.eglInitialize(display, ver);

    int[] configSpec = {EGL10.EGL_NONE};
    EGLConfig[] configOut = new EGLConfig[1];
    int[] nConfig = new int[1];
    egl.eglChooseConfig(display, configSpec, configOut, 1, nConfig);
    config = configOut[0];
    eglContext = egl.eglCreateContext(display, config, EGL10.EGL_NO_CONTEXT, null);
    surface = egl.eglCreateWindowSurface(display, config, SurfaceHolder.SURFACE_TYPE_GPU, null);
    egl.eglMakeCurrent(display, surface, surface, eglContext);
    gl = (GL11) eglContext.getGL();
}
public void savePixels(int x, int y, int w, int h, GL10 gl)
{
    if (gl == null)
            return;

     synchronized (this) {
     if (mSavedBM != null) {
     mSavedBM.recycle();
     mSavedBM = null;
     }
     }

    int b[] = new int[w * (y + h)];
    int bt[] = new int[w * h];
    IntBuffer ib = IntBuffer.wrap(b);
    ib.position(0);
    gl.glReadPixels(x, 0, w, y + h, GL10.GL_RGBA,GL10.GL_UNSIGNED_BYTE,ib);

    for (int i = 0, k = 0; i < h; i++, k++)
    {
        //OpenGLbitmap is incompatible with Android bitmap
        //and so, some corrections need to be done.
            for (int j = 0; j < w; j++)
            {
                    int pix = b[i * w + j];
                    int pb = (pix >> 16) & 0xff;
                    int pr = (pix << 16) & 0x00ff0000;
                    int pix1 = (pix & 0xff00ff00) | pr | pb;
                    bt[(h - k - 1) * w + j] = pix1;
            }
    }

    Bitmap sb = Bitmap.createBitmap(bt, w, h, Bitmap.Config.ARGB_8888);
    synchronized (this)
    {
        mSavedBM = sb;
    }
} 

static String saveBitmap(Bitmap bitmap, String dir, String baseName) {
    try {
        File sdcard = Environment.getExternalStorageDirectory();
        File pictureDir = new File(sdcard, dir);
        pictureDir.mkdirs();
        File f = null;
        for (int i = 1; i < 200; ++i) {
            String name = baseName + i + ".png";
            f = new File(pictureDir, name);
            if (!f.exists()) {
                break;
            }
        }
        if (!f.exists()) {
            String name = f.getAbsolutePath();
            FileOutputStream fos = new FileOutputStream(name);
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
            fos.flush();
            fos.close();
            return name;
        }
    } catch (Exception e) {

    } finally {

        //if (fos != null) {
         //   fos.close();
       // }

    }
    return null;
}

此外,如果有人能指导我更好的读取framebuffer的方法,那就太好了。我正在使用Android 2.2和API级别为8的虚拟设备。 我已经阅读了许多以前的讨论,并发现我们不能直接通过“/dev/graphics/fb0”读取帧缓冲区。

(编辑:重新格式化第一行代码)


你对这段代码有什么问题? - Alan
在模拟器上出现了错误窗口,显示“抱歉,应用程序意外停止”。 - AliR
1个回答

2

问题已解决,关于上述代码的执行。但我仍然无法读取帧缓冲区数据。

我深入研究了内部并追踪了所有之前关于在Android 1.5之前的旧版本上访问帧缓冲区的说法。

在Android 1.5之前的端口确实有访问/dev/fb0直接帧缓冲区的帖子。但这对于后来的版本不起作用,并且Android开发团队在android google groups中也没有提到此计划。

我希望这可以帮助很多人节省他们花费的大量时间去找出一种方法。

敬礼, 阿里


2
解决了吗?请发布您的解决方案。 - davenpcj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接