2010-06-08 14 views
5

Je suis nouveau au développement d'Android et ai une affectation pour lire des données de cadre de cadre après un intervalle de temps spécifié.Le code source d'Android ne fonctionne pas, en lisant le tampon de cadre par glReadPixels

Je suis venu avec le code suivant:

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

}

De plus, si quelqu'un peut me diriger vers une meilleure façon de lire le framebuffer ce serait génial. J'utilise Android 2.2 et le périphérique virtuel de niveau API 8. J'ai passé par beaucoup de discussions précédentes et j'ai constaté que nous ne pouvons pas lire le tampon de trame directement à travers le "/ dev/graphics/fb0".

(edit: reformatage premières lignes de code)

+0

Quel est le problème que vous avez avec ce code? – Alan

+0

Il donnait une fenêtre d'erreur sur l'émulateur de "Désolé, l'application s'est arrêtée de manière inattendue" – AliR

Répondre

2
problème

résolu, en ce qui concerne l'exécution du code ci-dessus. Mais je ne pouvais toujours pas lire les données du tampon de trame.

J'ai étudié en profondeur les éléments internes et retracé toutes les revendications précédentes sur l'accès à framebuffer sur les anciennes versions d'Android pré 1.5.

Le portage sur Android pre 1.5 a des messages sur l'accès au framebuffer directement via/dev/fb0. Cela ne fonctionne pas pour les versions ultérieures et l'équipe de développement Android n'a aucun plan tel que mentionné par eux dans les groupes google android. J'espère que cela aidera beaucoup de gens à passer beaucoup de temps à trouver une solution.

salutations, Ali

+2

Résolu comment? veuillez poster votre solution – davenpcj