加载底层库ScreenCap.java:
public class ScreenCap { static {
System.loadLibrary("scrcap");
} static native void captureScreenToFile(String fileName);
}
广播接收器:
public class ScreenCapReceiver extends BroadcastReceiver { private static final String LOG_TAG = "ScreenCapReceiver"; @Override
public void onReceive(Context context, Intent intent) {
// Temp code, should not in main thread
Log.d(LOG_TAG, "generate file name");
//Checking external storage
boolean mExternalStorageWriteable = false;
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
mExternalStorageWriteable = true;
} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
mExternalStorageWriteable = false;
} else {
mExternalStorageWriteable = false;
} if (!mExternalStorageWriteable)
return; File file = new File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "SCRCAP_"+System.currentTimeMillis()+".png"); Log.d(LOG_TAG, "Capture screen to : " + file.getAbsolutePath()); ScreenCap.captureScreenToFile(file.getAbsolutePath()); Log.d(LOG_TAG, "screen captured");
} }
ScreenCap.cpp:
#include <utils/Log.h> #include <binder/IPCThreadState.h>
#include <binder/ProcessState.h>
#include <binder/IServiceManager.h> #include <binder/IMemory.h>
#include <surfaceflinger/ISurfaceComposer.h> #include <SkImageEncoder.h>
#include <SkBitmap.h> #include "com_cust_android_screencap_ScreenCap.h" using namespace android;
/*
* Class: com_cust_android_screencap_ScreenCap
* Method: captureScreenToFile
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_com_cust_android_screencap_ScreenCap_captureScreenToFile
(JNIEnv *env, jclass clazz, jstring fileName) { 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);
if (err != NO_ERROR) {
fprintf(stderr, "screen capture failed: %s\n", strerror(-err));
return;
} LOGD("screen capture success: w=%u, h=%u, pixels=%p\n",
w, h, heap->getBase()); SkBitmap b;
b.setConfig(SkBitmap::kARGB_8888_Config, w, h);
b.setPixels(heap->getBase());
SkImageEncoder::EncodeFile(env->GetStringUTFChars(fileName, 0), b,
SkImageEncoder::kPNG_Type, SkImageEncoder::kDefaultQuality); } JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) {
return JNI_VERSION_1_6;
} JNIEXPORT void JNICALL JNI_OnUnload(JavaVM* vm, void* reserved) { }