android屏幕截取实现,Android 屏幕截图(底层实现方式)

加载底层库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

#include

#include

#include

#include

#include

#include

#include

#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 composer;

getService(name, &composer);

sp 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) {

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值