Java 使用glReadPixels()查找用于截图的正确上下文

Java 使用glReadPixels()查找用于截图的正确上下文,java,android,opengl-es,screenshot,glreadpixels,Java,Android,Opengl Es,Screenshot,Glreadpixels,我正试图通过glReadPixels()直接从帧缓冲区读取,这样我就可以从屏幕上的任何内容获取屏幕截图。 我没有使用GUI,相反,每当我触摸屏幕时,它应该打印屏幕的原始内容(这对于开始就足够了) 我现在陷入了为gl.glReadPixels()函数获取正确上下文的困境 因为我认为我现在看到的背景与屏幕上的实际内容无关 当我运行应用程序时,它会打印一个libEGL错误 在没有当前上下文的情况下调用OpenGL ES API(每年记录一次) (螺纹) 然后我的数组中填充了零 为了隐藏我的应用程序,我

我正试图通过glReadPixels()直接从帧缓冲区读取,这样我就可以从屏幕上的任何内容获取屏幕截图。
我没有使用GUI,相反,每当我触摸屏幕时,它应该打印屏幕的原始内容(这对于开始就足够了)

我现在陷入了为gl.glReadPixels()函数获取正确上下文的困境
因为我认为我现在看到的背景与屏幕上的实际内容无关

当我运行应用程序时,它会打印一个libEGL错误

在没有当前上下文的情况下调用OpenGL ES API(每年记录一次) (螺纹)

然后我的数组中填充了零

为了隐藏我的应用程序,我在清单中使用以下行

android:theme="@android:style/Theme.Translucent.NoTitleBar" 
代码如下:

公共类截屏活动扩展活动{
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
}
@凌驾
公共布尔onTouchEvent(运动事件){
如果(event.getAction()==MotionEvent.ACTION\u UP){
保存像素();
}
返回true;
}
EGL10 egl=(EGL10)EGLContext.getEGL();
GL10 gl=(GL10)egl.eglGetCurrentContext().getGL();
公共void savePixels(){
w=getWidth(本);
h=getHeight(此);
int b[]=新int[w*h];
int bt[]=新的int[w*h];
IntBuffer ib=IntBuffer.wrap(b);
ib.位置(0);
gl.glReadPixels(0,0,w,h,GL10.gl_RGBA,GL10.gl_无符号字节,ib);
对于(int i=0;i>16)和0xff;
int pr=(pix

您必须将mGLSurfaceView更改为您的SurfaceView实例。

人们是否可以停止滥用OpenGL拍摄屏幕截图?若您想捕获执行glReadPixels调用的程序的渲染输出,这是可以的,但一旦其他程序成为预期的像素源,它就会变得非常不可用负责任的


拍摄全屏截图的唯一可靠方法是直接从GPU视频缓冲存储器中读取。Android基于Linux,Linux为此提供了fbdev设备。由于使用所有这些IOCTL有点麻烦,因此应使用测试库。Android库提供了拍摄屏幕的专用APIhots:

终于找到了一个开源程序,它没有使用/dev/graphics/fb0捕获帧缓冲区


该软件包包括一个C程序和一个python脚本,两者都工作得很好。

但是当我不打算创建一个软件包时,我的SurfaceView是什么?我的应用程序是隐藏的,应该捕获屏幕的内容(它不属于我的应用程序)。一开始它看起来很有希望,但有一个问题。至少当我运行asl-demo.apk时,它只读取/dev/graphics/fb0中的内容,而我的设备上只有黑色。我已经读到它与tegra 3芯片有关,该芯片不使用fb0帧缓冲区。为了确保我在fb0中填充了/dev/uradom,并且之后有这个随机噪声图像rwards作为屏幕截图。所以它看起来不像是直接从GPU视频缓冲区读取的,是吗?你知道screencap.cpp是如何工作的吗?因为这个函数可以截图。我只需要知道它从哪里获取屏幕截图的数据。@user2207148:它正在与显示合成器对话以检索合成图像。除了直接从帧缓冲存储器读取外,这是在合成图形系统中获取屏幕截图的唯一可靠方法。
mGLSurfaceView.queueEvent(new Runnable() {
  public void run() {
    savePixels();
  }
});