Click here to Skip to main content
15,905,616 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
Hi all!
I try to get fullscreen's screenshot in Android. I've found code snippet on internet which do it through openGL. But it doesn't work!
Code snippet:
public class RemoteManager 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;
	   
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);    
       
        setContentView(R.layout.main);
     // 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.
        System.out.println("---------already done!!!");
        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);
    GLSurfaceView surfaceView = new GLSurfaceView(this); 
    SurfaceHolder holder = surfaceView.getHolder(); 
    //////////////// ERROR!!!///////////
    surface = egl.eglCreateWindowSurface(display, config, holder, 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;
    } 

The function 'eglCreateWindowSurface' falls down with error!
Error:
09-26 05:05:32.256: ERROR/AndroidRuntime(946): Caused by: java.lang.IllegalArgumentException: Make sure the SurfaceView or associated SurfaceHolder has a valid Surface
09-26 05:05:32.256: ERROR/AndroidRuntime(946):     at com.google.android.gles_jni.EGLImpl._eglCreateWindowSurface(Native Method)
09-26 05:05:32.256: ERROR/AndroidRuntime(946):     at com.google.android.gles_jni.EGLImpl.eglCreateWindowSurface(EGLImpl.java:87)
09-26 05:05:32.256: ERROR/AndroidRuntime(946):     at com.ares.RemoteManager.initGLFr(RemoteManager.java:95)

What do I wrong? Please help me!!!
Sorry for my English!
Posted

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900