2014-04-04 40 views
1

我是Android的新手。 我使用Nexus7參考設備,我已經從source.android.com下載完整的源代碼。 我有一個工程系統圖像,我可以製作一個系統應用程序。如何直接從screencap.cpp獲取像素數據

/system/bin/screencap實用程序對我來說很好的捕捉屏幕。 我想直接在我的應用程序中使用screencap.cpp獲得像素數據。

當我使用screencap實用程序時,過程如下所示。

  1. 捕獲屏幕並保存圖像。
  2. 打開圖像文件
  3. decodefile從位圖

位圖

  • 獲取像素數據(int數組)我想刪除的步驟,和。 只需調用api即可直接獲取屏幕的像素數據, 我該怎麼做?

  • +0

    你可以分享screencap.cpp的代碼嗎? – Dipika

    +0

    @Dipika你可以在http://androidxref.com/4.4.2_r2/xref/frameworks/base/cmds/screencap/screencap.cpp看到源代碼。 – user3496980

    回答

    0

    如果您正在編寫Java應用程序,請從應用程序調用/system/bin/screencap(使用java.lang.Process),並將結果作爲二進制流讀取到內存中。您可以在screencap.cpp中看到二進制結構,但它的寬度,高度和格式均爲四個字節的整數,後跟數據。

    請注意其他讀者:只有當您是系統應用程序時纔可能。

    0

    1)您可以使用套接字通過網絡將數據從screencap實用程序傳輸到您的應用程序。

    2)Android NDK可用於從您的應用程序直接函數調用您的實用程序。

    1

    如果您使用系統權限運行,則可以要求SurfaceComposerClient獲取像素數據,而不是啓動一個單獨的進程來爲您執行此操作。

    望着擷取畫面source code,你真正需要的是粘合劑初始化:

    ProcessState::self()->startThreadPool(); 
    

    SurfaceComposerClient IPC電話:

    ScreenshotClient screenshot; 
    sp<IBinder> display = SurfaceComposerClient::getBuiltInDisplay(displayId); 
    if (display != NULL && screenshot.update(display, Rect(), false) == NO_ERROR) { 
        base = screenshot.getPixels(); 
        w = screenshot.getWidth(); 
        h = screenshot.getHeight(); 
        s = screenshot.getStride(); 
        f = screenshot.getFormat(); 
        size = screenshot.getSize(); 
    } 
    

    可以放心地忽略它下面的所有/dev/graphics/fb0的東西 - - 這是一種不再適用的老方法。其餘代碼僅用於PNG壓縮。

    如果您沒有使用系統權限運行,則無法捕獲整個屏幕。但你可以capture your app

    相關問題