关于Android composer->captureScreen 截屏

Posted

技术标签:

【中文标题】关于Android composer->captureScreen 截屏【英文标题】:About Android composer->captureScreen capture screen 【发布时间】:2012-11-11 14:49:10 【问题描述】:

我想在android4.0.3 中使用android 源代码截屏。它可以正确编译。运行时报错:Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1). 调试发现在cpp文件中调用composer->captureScreen函数,返回NO_ERROR值,但是heap为null,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" />

在清单中。

【问题讨论】:

【参考方案1】:

我一直试图在另一个类中调用未初始化的画布,所以当它试图获取它的高度或宽度时,它会崩溃。

请参阅原始 SO answer 至 Android Fatal Signal 11。

【讨论】:

以上是关于关于Android composer->captureScreen 截屏的主要内容,如果未能解决你的问题,请参考以下文章

Android Jectpack-Compose 库的粗略学习

Android Jectpack-Compose 库的粗略学习

centos安装composer下载包curl时CA证书报错

composer安装

3年以上Android开发者,关于学习 Compose,我的经验总结和建议

Android-Compose-Tab