3

The following is the code I am using to take a screen shot using GLSurfaceView. But I dont know why the onDraw() method in the GLSurfaceView.Renderer Class is not being called.

Please if some one can look at the code below and point out what am I doing wrong.

public class MainActivity extends Activity {

    private GLSurfaceView mGLView;
    int x,y,w,h;
    Display disp;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        // ToDo add your GUI initialization code here

        setContentView(R.layout.main);
        x=0;
        y=0;

        disp = getWindowManager().getDefaultDisplay();

        w = disp.getWidth();
        h = disp.getHeight();

       mGLView = new ClearGLSurfaceView(this);


    }

    class ClearGLSurfaceView extends GLSurfaceView {
    public ClearGLSurfaceView(Context context) {
        super(context);
        setDebugFlags(DEBUG_CHECK_GL_ERROR | DEBUG_LOG_GL_CALLS);
        mRenderer = new ClearRenderer();
        setRenderer(mRenderer);
    }

        ClearRenderer mRenderer;
}


    class ClearRenderer implements GLSurfaceView.Renderer {

    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        // Do nothing special.
    }

    public void onSurfaceChanged(GL10 gl, int w, int h) {
        //gl.glViewport(0, 0, w, h);
    }

    public void onDrawFrame(GL10 gl) {
        //gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
        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++)

         {//remember, that OpenGL bitmap is incompatible with Android bitmap

          //and so, some correction need.

              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 bmp = Bitmap.createBitmap(bt, w, h,Bitmap.Config.ARGB_8888);

         try

                {
                        File f = new File("/sdcard/testpicture.png");
                        f.createNewFile();
                        FileOutputStream fos=new FileOutputStream(f);

                        bmp.compress(CompressFormat.PNG, 100, fos);

                        try

                        {

                                fos.flush();

                        }

                        catch (IOException e)

                        {

                                // TODO Auto-generated catch block

                                e.printStackTrace();

                        }

                        try

                        {

                                fos.close();

                        }

                        catch (IOException e)

                        {

                                // TODO Auto-generated catch block

                                e.printStackTrace();

                        }



                }

                catch (FileNotFoundException e)

                {

                        // TODO Auto-generated catch block

                        e.printStackTrace();

                }
                catch(IOException e)
                {
                    e.printStackTrace();
                }

    }
}

}

Please someone help me out. I have just started learning to work on android.

Dhara Patel
  • 359
  • 5
  • 19
ujjawal
  • 146
  • 1
  • 8

1 Answers1

1

Although you create the surfaceview, you don't set it to be the current contentview

setContentView(mGLView);

Also, you are creating the screenshot every single frame, which is very inefficient and probably not what you'll want..

slezadav
  • 6,104
  • 7
  • 40
  • 61
Will Kru
  • 5,164
  • 3
  • 28
  • 41
  • Thank you will kru. but i figured that out some days ago. One more thing I would like to share that I want to take screen shot of entire screen. This method will take the screen shot only of the view. So this method is of no help. moreover, I have browsed the net for days and just concluded that for taking the screenshot of entire screen we would inevitably need to root the phone. If you can suggest something that would accomplish the task without needing to root the phone then it wil be very nice of you, thankyou. – ujjawal Jan 21 '11 at 05:29