使用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++截屏并显示的更多相关文章

  1. Android自己定义截屏功能,相似QQ截屏

    由于公司业务需求 须要对一个屏幕进行截屏.但自带的截屏功能是远远不够项目的功能需求 ,我们是做一个画板软件 .须要的像QQ那样截屏之后 ,能够看到我们自己定义的工具.有画笔,button等等 .and ...

  2. Android命令行截屏screencap

    Android下面使用命令行截图. 因为工作调试用的机器,没法连接USB,所以用不了一般的截图方法,后来查了一下,Android4.0以后都内置了截图命令. 可以使用下面命令截取屏幕. screenc ...

  3. android防止系统截屏

    protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow() ...

  4. 记一次完整的android源码截屏事件的捕获<标记砖>

    http://blog.csdn.net/buptgshengod/article/details/19911909?utm_source=tuicool&utm_medium=referra ...

  5. Android开发笔记:安卓程序截屏方法

    1,基于Android SDK的截屏方法 (1)主要就是利用SDK提供的View.getDrawingCache()方法.网上已经有很多的实例了.首先创建一个android project,然后进行L ...

  6. Android系统截屏的实现(附代码)

    1.背景                     写博客快两年了,写了100+的文章,最火的文章也是大家最关注的就是如何实现android系统截屏.其实我们google android_screen_ ...

  7. Android 截屏的各种骚操作

    本文公众号「AndroidTraveler」首发. 背景 在实际的应用场景中,Android 手机的截屏其实是很普遍的. 比如说 PPT 演示,比如说技术博客图文并茂讲解. 因此懂得 Android ...

  8. Android8.1 MTK平台 截屏功能分析

    前言 涉及到的源码有 frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager.java vend ...

  9. iOS检测用户截屏并获取所截图片

    iOS检测用户截屏并获取所截图片 微信可以检测到用户截屏行为(Home + Power),并在稍后点击附加功能按钮时询问用户是否要发送刚才截屏的图片,这个用户体验非常好.在iOS7之前, 如果用户截屏 ...

随机推荐

  1. javascript中字符串的比较规则

    弄清这个还是很重要的,在字符排序中很有用处 非空字符串 > 空字符串 从第一个字符的charCode开始比较,大的就大 所有的字符都相同,就比较长度,长的大 '0'>'' '2'>' ...

  2. Apache thrift RPC 双向通信

    在上一篇介绍Apache thrift 安装和使用,写了一个简单的demo,讲解thrift服务的发布和客户端调用,但只是单向的客户端发送消息,服务端接收消息.而客户端却得不到服务器的响应. 在不涉及 ...

  3. 为 Sublime Text 3059 配置 PHP 编译环境

    关于  Sublime Text 3059 的安装及汉化 请参看 http://www.xiumu.org/note/sublime-text-3.shtml 为 sublime Text 配置 PH ...

  4. 爬虫技术 -- 进阶学习(十)网易新闻页面信息抓取(htmlagilitypack搭配scrapysharp)

    最近在弄网页爬虫这方面的,上网看到关于htmlagilitypack搭配scrapysharp的文章,于是决定试一试~ 于是到https://www.nuget.org/packages/Scrapy ...

  5. 设计模式(十三):从“FQ”中来认识代理模式(Proxy Pattern)

    我们知道Google早就被墙了,所以FQ才能访问Google呢,这个“FQ”的过程就是一个代理的过程.“代理模式”在之前的博客中不止一次的提及过,之前的委托回调就是代理模式的具体应用.今天我们就从“F ...

  6. Hive读取外表数据时跳过文件行首和行尾

    作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 有时候用hive读取外表数据时,比如csv这种类型的,需要跳过行首或者行尾一些和数据无关的或者自 ...

  7. VS2015企业版,社区版,专业版详细对比

    VS2015 微软出了3个大版本,其实在前天晚上就放出了三个版本的对比说明.,但是昨天挂掉了..今天特意去看了..截取了自己觉得比较重要的分享一下. 首先我们最常用的 诊断调试工具 其次测试工具(区别 ...

  8. 来,一起让我们越来越懒,面向CSS、JS未来编程。(9.28已更新)

    2016.10.29更新 本文存在大量的错误,仅供参考. 不知不觉在前端领域马上一个年头就要过去了,然而再看看自己的代码,果然够烂,那么为什么代码一直没有用面向对象的思维去写CSS呢?首先有两点:一点 ...

  9. Kafka0.8.2.1删除topic逻辑

    前提条件: 在启动broker时候开启删除topic的开关,即在server.properties中添加:  delete.topic.enable=true 命令: bin/kafka-topics ...

  10. [C1] 仿 Excel 实现(C1FlexGrid)

    一  分析阶段 根据 Excel 表格区域的划分,如下图,基本上以4行*3列的框架搭建: 第一行为列头区域     ==>  C1FlexGrid.ColumnHeaders 第二行为单元格区域 ...