Android使用C++截屏并显示
使用android底层自带的截屏源码进行修改后,将截取屏幕的内容再次显示在屏幕上,使屏幕呈现出暂停的效果。
android自带的截屏代码在android\JB\frameworks\base\cmds\screencap\screencap.cpp文件中,我是参考这个进行修改的,代码如下:
int main(int argc, char** argv)
{ sp<ProcessState> proc(ProcessState::self());
// create a client to surfaceflinger
sp<SurfaceComposerClient> client = new SurfaceComposerClient(); //创建SurfaceFlinger的本地代理
char str[];
DisplayInfo display;
//获取屏幕的宽高等信息
client->getDisplayInfo(client->getBuiltInDisplay(HWC_DISPLAY_PRIMARY), &display); //创建SurfaceControl的本地代理
sp<SurfaceControl> surfaceControl = client->createSurface(String8("testsurface"),
/**/, /**/, PIXEL_FORMAT_RGBA_8888, ); /*********************************************************************/
SurfaceComposerClient::openGlobalTransaction();
surfaceControl->setLayer(); //设置z轴
surfaceControl->setSize(display.w, display.h);
surfaceControl->setPosition(, ); //起始位置
SurfaceComposerClient::closeGlobalTransaction();
// 获取Surface本地代理
sp<Surface> surface = surfaceControl->getSurface();//获取surface
Surface::SurfaceInfo info; //创建SurfaceControl的本地代理
sp<SurfaceControl> surfaceControl1 = client->createSurface(String8("wenfu"),
display.w, display.h, PIXEL_FORMAT_RGBA_8888, );
SurfaceComposerClient::openGlobalTransaction();
surfaceControl1->setLayer(); //设置z轴
surfaceControl1->setSize(display.w, display.h);
surfaceControl1->setPosition(, ); //起始位置
SurfaceComposerClient::closeGlobalTransaction();
// 获取Surface本地代理
sp<Surface> surface1 = surfaceControl1->getSurface();//获取surface
Surface::SurfaceInfo info1; ssize_t bpr ;
SkBitmap bitmap;
SkCanvas canvas ;
SkCanvas canvas1;
SkBitmap bitmap1;
SkPath path;
SkPaint paint; //paint可以指定绘图的颜色,文本的大小及对齐方式,编码格式 int sx,sy;
int w,h;
int flg = ;
int flg2 = ;
int lastx = , lasty = , ctrx = , ctry = ;
char st[];
/////////////////////////////////////////////////////////////////////////////////////////
void const* mapbase = MAP_FAILED;
ssize_t mapsize = -;
void const* base = ;
size_t size = ;
int ww,hh;
ScreenshotClient screenshot; //下面是截屏操作
sp<IBinder> display1 = SurfaceComposerClient::getBuiltInDisplay(ISurfaceComposer::eDisplayIdMain);
if (display1 != NULL && screenshot.update(display1) == NO_ERROR)
{
base = screenshot.getPixels();
ww = screenshot.getWidth();
hh = screenshot.getHeight();
size = screenshot.getSize();
} if (base) //以下是显示部分
{
SkBitmap bitm;
bitm.setConfig(SkBitmap::kARGB_8888_Config, ww, hh);
bitm.setPixels((void*)base);
surface1->lock(&info1);
bpr = info1.s * bytesPerPixel(info1.format);
bitmap1.setConfig(SkBitmap::kARGB_8888_Config, display.w, display.h, bpr);
bitmap1.setPixels(info1.bits);
canvas1.setDevice(new SkDevice(bitmap1));
canvas1.drawBitmap(bitm, SkIntToScalar(), SkIntToScalar()); //从0,0点开始画图
surface1->unlockAndPost();
}
if (mapbase != MAP_FAILED) {
munmap((void *)mapbase, mapsize);
}
//////////////////////////////////////////////////////////////////////////////////////// while(); return ;
}
代码写的比较粗糙,实验型代码。最开始使用自带的screencap来做,比较耗时,自带的是将截取的屏幕内容保存到png文件里,让后我再读取png文件,这样截屏存储又显示速度很慢,需要5到6秒的时间,这样直接截屏显示只需要不到500ms时间。
Android使用C++截屏并显示的更多相关文章
- Android自己定义截屏功能,相似QQ截屏
由于公司业务需求 须要对一个屏幕进行截屏.但自带的截屏功能是远远不够项目的功能需求 ,我们是做一个画板软件 .须要的像QQ那样截屏之后 ,能够看到我们自己定义的工具.有画笔,button等等 .and ...
- Android命令行截屏screencap
Android下面使用命令行截图. 因为工作调试用的机器,没法连接USB,所以用不了一般的截图方法,后来查了一下,Android4.0以后都内置了截图命令. 可以使用下面命令截取屏幕. screenc ...
- android防止系统截屏
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow() ...
- 记一次完整的android源码截屏事件的捕获<标记砖>
http://blog.csdn.net/buptgshengod/article/details/19911909?utm_source=tuicool&utm_medium=referra ...
- Android开发笔记:安卓程序截屏方法
1,基于Android SDK的截屏方法 (1)主要就是利用SDK提供的View.getDrawingCache()方法.网上已经有很多的实例了.首先创建一个android project,然后进行L ...
- Android系统截屏的实现(附代码)
1.背景 写博客快两年了,写了100+的文章,最火的文章也是大家最关注的就是如何实现android系统截屏.其实我们google android_screen_ ...
- Android 截屏的各种骚操作
本文公众号「AndroidTraveler」首发. 背景 在实际的应用场景中,Android 手机的截屏其实是很普遍的. 比如说 PPT 演示,比如说技术博客图文并茂讲解. 因此懂得 Android ...
- Android8.1 MTK平台 截屏功能分析
前言 涉及到的源码有 frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager.java vend ...
- iOS检测用户截屏并获取所截图片
iOS检测用户截屏并获取所截图片 微信可以检测到用户截屏行为(Home + Power),并在稍后点击附加功能按钮时询问用户是否要发送刚才截屏的图片,这个用户体验非常好.在iOS7之前, 如果用户截屏 ...
随机推荐
- CI Weekly #6 | 再谈 Docker / CI / CD 实践经验
CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分享,包括国内外持续集成.持续交付,持续部署.自动化测试. DevOps 等实践教程.工具与资源,以及一些工程师文化相关的程序员 Ti ...
- 使用 Swagger 自动生成 ASP.NET Core Web API 的文档、在线帮助测试文档(ASP.NET Core Web API 自动生成文档)
对于开发人员来说,构建一个消费应用程序时去了解各种各样的 API 是一个巨大的挑战.在你的 Web API 项目中使用 Swagger 的 .NET Core 封装 Swashbuckle 可以帮助你 ...
- tornado session
[转]tornado入门 - session cookie 和session 的区别: 1.cookie数据存放在客户的浏览器上,session数据放在服务器上. 2.cookie不是很安全,别人可以 ...
- JavaScript中的apply,call与this的纠缠
1.apply定义 apply:调用函数,并用指定对象替换函数的 this 值,同时用指定数组替换函数的参数. 语法:apply([thisObj[,argArray]]) thisObj 可选.要用 ...
- Android okHttp网络请求之Json解析
前言: 前面两篇文章介绍了基于okHttp的post.get请求,以及文件的上传下载,今天主要介绍一下如何和Json解析一起使用?如何才能提高开发效率? okHttp相关文章地址: Android o ...
- C#:浅析结构与类的区别
一. 结构:值类型,存储在堆栈中,位于计算机的内存逻辑区域中 类 :引用类型,存储在堆中,位于计算机内存的不同逻辑位置 二. 较小的数据使用结构: 将一 ...
- Oracle数据库异机升级
环境: A机:RHEL5.5 + Oracle 10.2.0.4 B机:RHEL5.5 需求: A机10.2.0.4数据库,在B机升级到11.2.0.4,应用最新PSU补丁程序. 目录: 一. 确认是 ...
- Wizard Framework:一个自己开发的基于Windows Forms的向导开发框架
最近因项目需要,我自己设计开发了一个基于Windows Forms的向导开发框架,目前我已经将其开源,并发布了一个NuGet安装包.比较囧的一件事是,当我发布了NuGet安装包以后,发现原来已经有一个 ...
- MFC&Halcon之实时视频监控
上一篇实现了在MFC的窗体内显示图片,本篇介绍如何在MFC窗体内实时显示摄像头的影像. 要实现的功能是点击一个“开始”按钮,可以显示影像,再点击“停止”按钮,可以停止显示. 因为实时显示影像需要在一个 ...
- 分享一实战性开源MVC框架<Linux、Windows跨平台开发so easy>
一.引子 开源地址 https://github.com/564064202/Moon.Mvc 欢迎加入开发 .NET Core微软还在发力,但作为商用还有一段距离,很多开发库尚不能用于.NET ...