我是Android的新手。 我使用Nexus7參考設備,我已經從source.android.com下載完整的源代碼。 我有一個工程系統圖像,我可以製作一個系統應用程序。如何直接從screencap.cpp獲取像素數據
/system/bin/screencap
實用程序對我來說很好的捕捉屏幕。 我想直接在我的應用程序中使用screencap.cpp獲得像素數據。
當我使用screencap實用程序時,過程如下所示。
- 捕獲屏幕並保存圖像。
- 打開圖像文件
- decodefile從位圖
位圖
我是Android的新手。 我使用Nexus7參考設備,我已經從source.android.com下載完整的源代碼。 我有一個工程系統圖像,我可以製作一個系統應用程序。如何直接從screencap.cpp獲取像素數據
/system/bin/screencap
實用程序對我來說很好的捕捉屏幕。 我想直接在我的應用程序中使用screencap.cpp獲得像素數據。
當我使用screencap實用程序時,過程如下所示。
位圖
如果您正在編寫Java應用程序,請從應用程序調用/system/bin/screencap
(使用java.lang.Process
),並將結果作爲二進制流讀取到內存中。您可以在screencap.cpp
中看到二進制結構,但它的寬度,高度和格式均爲四個字節的整數,後跟數據。
請注意其他讀者:只有當您是系統應用程序時纔可能。
1)您可以使用套接字通過網絡將數據從screencap實用程序傳輸到您的應用程序。
2)Android NDK可用於從您的應用程序直接函數調用您的實用程序。
如果您使用系統權限運行,則可以要求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。
你可以分享screencap.cpp的代碼嗎? – Dipika
@Dipika你可以在http://androidxref.com/4.4.2_r2/xref/frameworks/base/cmds/screencap/screencap.cpp看到源代碼。 – user3496980