我想用android源代码捕获android4.0.3中的屏幕。它可以正确编译。运行时,它有错误:Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1).
调试发现在cpp文件中调用composer->captureScreen
函数,然后返回NO_ERROR值,但堆为空,w和h为0.所以有错误当调用heap-> getBase()时。我对此感到困惑。
{
const char *file_path = env->GetStringUTFChars(file, NULL);
const String16 name("SurfaceFlinger");
sp<ISurfaceComposer> composer;
getService(name, &composer);
sp<IMemoryHeap> heap;
uint32_t w, h;
PixelFormat f;
status_t err = composer->captureScreen(0, &heap, &w, &h, &f,0,0,0,INT_MAX);///*for 4.1.3*/,0,0
if (err != NO_ERROR) {
LOGE("screen capture failed: %s\n", strerror(-err));
exit(0);
}
LOGD("screen capture success: w=%u, h=%u, pixels=%p\n",
w, h, heap->getBase());
LOGD("saving file as PNG in %s ...\n", file_path);
SkBitmap b;
b.setConfig(SkBitmap::kARGB_8888_Config, w, h);
b.setPixels(heap->getBase());
SkImageEncoder::EncodeFile(file_path, b,
SkImageEncoder::kPNG_Type, SkImageEncoder::kDefaultQuality);
return file;
}
编辑:我添加了
<uses-permission android:name="android.permission.READ_FRAME_BUFFER" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
在清单中。
答案 0 :(得分:0)
我一直试图在另一个类中调用未初始化的Canvas,所以当它试图获得它的高度或宽度时,它会崩溃。
请参阅原始的answer至Android Fatal Signal 11。