0

Android4.0.3でAndroidのソースコードを使って画面をキャプチャしたいです。正しくコンパイルできます。実行すると、次のエラーが発生しますFatal signal 11 (SIGSEGV) at 0x00000000 (code=1).。デバッグcomposer->captureScreenにより、cpp ファイルで関数を呼び出し、NO_ERROR 値が返されましたが、ヒープが 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" />

マニフェストで。

4

1 に答える 1

0

初期化されていないキャンバスを別のクラス内で呼び出そうとしていたため、その高さまたは幅を取得しようとするとクラッシュしました。

Android Fatal Signal 11に対する元のSO回答を参照してください。

于 2012-11-23T09:08:17.873 に答える