Android 屏幕截图(底层实现方式)
Android 实现 方式 屏幕 底层 截图
2023-09-27 14:23:51 时间
加载底层库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) { }
下载源码:http://download.csdn.net/detail/weiyirong/5836997
相关文章
- Android锁屏或灭屏状态下,高速按两次音量下键实现抓拍功能(1.2Framework层使用startService形式实现)
- ASP.NET MVC Filters 4种默认过滤器的使用【附示例】 数据库常见死锁原因及处理 .NET源码中的链表 多线程下C#如何保证线程安全? .net实现支付宝在线支付 彻头彻尾理解单例模式与多线程 App.Config详解及读写操作 判断客户端是iOS还是Android,判断是不是在微信浏览器打开
- Android 性能优化探究
- android 自定义水波纹点击效果Button
- Android开发系列(二十三):实现带图片提示的Toast提示信息框
- Android Design Support Library(二)用NavigationView实现抽屉菜单界面
- Android开源框架:Retrofit
- Android 自定义Adapter实现多视图Item的ListView
- 从零开始学android开发-四大组件之一 Activity
- Android反射机制:手把手教你实现反射
- Android动态修改图片颜色的实现方式分析
- 教你搞定Android自定义View
- Android 仿PhotoShop调色板应用(三) 主体界面绘制
- Android应用程序组件Content Provider应用实例
- Android自定义控件(一)——开关控件
- 实现Android 版网页快照功能
- Android实现计时与倒计时(限时抢购)的几种方法
- Android 图标上面添加提醒(二)使用开源UI类库 Viewbadger
- Android 实现书籍翻页效果----完结篇
- Android 换肤功能的实现(Apk插件方式)
- android开发,关于android app实现静默安装自己(系统签名)
- android 实现2张图片层叠效果
- android实现刮奖的效果
- 抖音 Android 包体积优化探索:基于 ReDex 的 DEX 优化落地实践
- Android按钮实现点击事件的四种方式
- android PopupWindow实现从底部弹出或滑出选择菜单或窗口
- android开发_SimpleAdapter适配器
- 超基础的Android studio的安装教程
- Android深入理解Context(二)Activity和Service的Context创建过程
- Android学习笔记之JSON数据解析
- LoadRunner+Android模所器实现抓包并调试本地服务端
- Android学习之Dialog的实现
- Android 自己定义ViewGroup 实战篇 -> 实现FlowLayout
- Android 中实现分享和第三方登陆---以新浪微博为例
- Android实现图片的三角形边框
- Android : Resource is not a Drawable (color or path)