最近要做手机截取当前屏幕的开发,发了大半天时间在网上找了很多资料,终于有了一个大概的头绪和思路,若有问题望指点,谢谢!

目前而言个人了解android有三种截屏方法:

1、android

SDK提供的截屏View.getDrawingCache()方法,当这个方法只能截取当前activity的界面,对自己的项目要求有点有同,既然可以实现就拿出来学习学习。

测试代码:

public class MainActivity

extends Activity implements OnClickListener {

private Button button;

private ImageView imageView;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

initView();

initListener();

}

private void initView() {

button = (Button) findViewById(R.id.button);

imageView = (ImageView) findViewById(R.id.IamagerView);

}

private void initListener() {

button.setOnClickListener(this);

}

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.button:

imageView.setImageBitmap(getSreenBitmap(v));

break;

default:

break;

}

}

private Bitmap getSreenBitmap(View v) {

View view = v.getRootView();

view.setDrawingCacheEnabled(true);

view.buildDrawingCache();

Bitmap bitmap = view.getDrawingCache();

if (bitmap == null) {

Log.d("tag", "null");

return null;

}

Log.d("tag", "return");

return bitmap;

}

}

2 基于android

ddmlib.jar这个包进行截屏,这个jar包位于/tools/lib目录下,网上找了很多资料讲的都不是很清楚,下了几个小Demo远行不了;貌似DDMS里面的截屏就是通过这个包来实现的。

3

基于android本地编程,读取framebuffer;

这是我现在使用的方法。它的优点是整个屏幕都可以截下来,同时不需要写JNI,也不需要Java层的实现。而且如果是emulator的话,也可以直接用adb来操作,十分方便(其实,有一个库android-screenshot-lib应该实现了类似的功能,但是我尝试了一下没有截图成功,图片大小不正确,且是黑屏。就没有进一步尝试了)。

Android的framebuffer介绍

framebuffer是linux内核对显示的最底层驱动。在一般的linux文件系统中,通过/dev/fb0设备文件来提供给应用程序对framebuffer进行读写的访问。这里,如果有多个显示设备,就将依次出现fb1,fb2,…等文件。而在我们所说的android系统中,这个设备文件被放在了/dev/graphics/fb0,而且往往只有这一个。

对android framebuffer的基本操作

1.读取framebuffer

2.Framebuffer转换为bitmap

3.bitmap生成图像文件

读取framebuffer

在android上使用这种方法第一个难题是获取framebuffer,因为默认的配置中framebuffer的读取权限是“root”,而Apk的权限最高只能提升到“system”,framework工作的权限也是“system”,也因此网上提供的截屏软件都只能在root过的手机上使用。对拥有源码的人来说,最简单的方法是直接改变framebuffer的权限,普通用户也有权限读取framebuffer。

然后就可以通过读文件的方式直接读取framebuffer,利用如下代码打开一个指向framebuffer的输入流就可以读取了。

publicstaticInputStream getInputStream()throwsException

{

FileInputStream

buf =newFileInputStream(

newFile("/dev/graphics/fb0"));

returnbuf;

}//get

the InputStream from framebuffer

framebuffer到bitmap的转换

framebuffer的数据是直接送入显示设备的,这些数据没有文件头,而且由于framebuffer读到数据跟显示方式关系很大,在不同设备上framebuffer的大小和数据格式不一样,读取前确定framebuffer的数据格式。

获取屏幕大小:

DisplayMetrics

metrics =newDisplayMetrics();

WindowManager

WM = (WindowManager)mContext

.getSystemService(Context.WINDOW_SERVICE);

Display

display = WM.getDefaultDisplay();

display.getMetrics(metrics);

intheight

= metrics.heightPixels;

//屏幕高

intwith

= metrics.widthPixels; //屏幕的宽

获取显示方式

intpixelformat

= display.getPixelFormat();

PixelFormat

localPixelFormat1

=newPixelFormat();

PixelFormat.getPixelFormatInfo(pixelformat,

localPixelFormat1);

intdeepth

= localPixelFormat1.bytesPerPixel;//位深

pixelformat代表的意义是在PixelFormat.java定义的:

public

static final int

RGBA_8888 =

1;

public

static final int

RGBX_8888 =

2;

public

static final int

RGB_888 =

3;

public

static final int

RGB_565 =

4;

public

static final int

RGBA_5551 =

6;

public

static final int

RGBA_4444 =

7;

public

static final int

A_8 =

8;

public

static final int

L_8 =

9;

public

static final int

LA_88 =

0xA;

public

static final int

RGB_332 =

0xB;

pixelformat是下面进行判断处理的依据,根据pixelformat计算出实际的深度。

一般

Framebuffer大小=(height*

with* deepth)*2;

之所以“*2”,是因为Framebuffer包含两帧画面,我们使用任何一帧都可以。

piex

=newbyte[height

* with * deepth];

InputStream

stream

= getInputStream(

newFile("/dev/graphics/fb0"));

DataInputStream

dStream =newDataInputStream(stream);

dStream.readFully(piex);

这样framebuffer的数据就被写进了piex。

piex生成bitmap

bitmap=

Bitmap.createBitmap(data,mwidth,mheight, config);

data:像素数据,data的一个元素表示一个像素,所以这里不能直接使用piex,必须经过转换。

mwidth,mheight:图像大小

config:图像格式,可以取以下数值

Bitmap.Config.ALPHA_8 (2),

Bitmap.Config.RGB_565 (4),

Bitmap.Config.ARGB_4444 (5),

Bitmap.Config.ARGB_8888 (6)

bitmap保存为png格式:

这是跟上面一样的

FileOutputStream out =newFileOutputStream(file_name);

bitmap.compress(Bitmap.CompressFormat.PNG,

100, out);

android关于截屏,关于android截屏知识的学习相关推荐

  1. android写代码截屏微信,android 模仿微信头像裁剪

    android 在android开发中经常会碰到修改头像的功能需求, 而在修改头像>中最难的部分就是在头像的裁剪功能.虽说网上一大堆裁剪的例子,但最重要的是要理解里面的实现原理,这样以后自己改起 ...

  2. android利用反射调用截屏api,Android利用反射机制调用截屏方法和获取屏幕宽高的方法...

    想要在应用中进行截屏,可以直接调用 View 的 getDrawingCache 方法,但是这个方法截图的话是没有状态栏的,想要整屏截图就要自己来实现了. 还有一个方法可以调用系统隐藏的 screen ...

  3. android webview 截图,Android获取webView快照与屏幕截屏的方法 -电脑资料

    前段时间做的一个书店项目其阅读模块中用到了WebView + js,今天把WebView这块用到的几个特性记录下, 其主要用到了webView的快照与屏幕的截屏.部分代码如下: [html] /** ...

  4. android长截屏代码,android长截屏原理及实现代码

    android长截屏原理及实现代码 发布时间:2020-08-31 06:55:16 来源:脚本之家 阅读:158 作者:Android笔记 小米系统自带的长截屏应该很多人都用过,效果不错.当长截屏时 ...

  5. Android滚动截屏,ScrollView截屏,Listview截屏,Recyclerview截屏, 截长图

    最近在做一个关于截频的功能, 恰逢鸿洋大神分享了一篇相关的博客, 我使用之后觉得甚是好用, 所以也整理了一下,以供学习. 在做分享功能的时候,需要截取全屏内容还有截长图,一屏展示不完的内容,一般我们会 ...

  6. android录屏弹窗,android视频截屏手机录屏实现代码

    本文介绍了android视频截屏&手机录屏实现代码,分享给大家,希望对大家有帮助 问题 在android中有时候我们需要对屏幕进行截屏操作,单一的截屏操作好解决可以通过activity的顶层v ...

  7. Android中关于屏幕的三个小众知识(宽屏适配、禁止截屏和保持屏幕常亮)

    转自:https://www.jb51.net/article/129633.htm 前言 宽屏适配.禁止截屏和保持屏幕常亮,这三个与屏幕有关的 Android 开发小众知识,说不定什么时候就派上用场 ...

  8. android 系统截屏原理,Android 系统副屏截屏功能

    收到一个客户需求,要求对双屏设备的副屏进行截图.查询资料后发现,系统截图有两种方法,一种是通过SurfaceControl.screenshot提供的接口调用,还有一种是通过screencap 命令获 ...

  9. Android App中监听系统截屏(截屏监听功能)

    功能需求: App内截屏监控功能,当发现用户在我们的app内进行了截屏操作时,进行对图片的二次操作,例如添加二维码,公司logo等一系列操作. 首先来app界面图及截屏监听图添加效果图 主要是利用内容 ...

最新文章

  1. javascript(js)的小数点乘法除法问题
  2. php开发我的世界插件,WorldEdit/开发与API
  3. 计算机视觉训练模型效果不佳怎么破?
  4. 设为首页加入收藏代码
  5. BZOJ4426 : [Nwerc2015]Better Productivity最大生产率
  6. 桌面记事本软件测试工资,记事本的一个BUG
  7. Linux安装MySQL的完整步骤并有关MySQL8.0版本的问题方法
  8. NGINX进程的基本操作和基础知识
  9. 升级linux 4.9内核,Linux 内核 4.8 将不再更新 建议迁往 4.9 稳定版
  10. sphinx php 扩展安装
  11. oracle考试试题及其答案,Oracle期末考试试题及答案-
  12. java判断一个数是不是素数_Java判断一个数是不是素数
  13. openpyxl,重写Worksheet
  14. Ignition Gazebo Fortress LTS试用
  15. 利用 IP 扩展访问列表实现应用服务的访问限制
  16. Bowtie使用介绍
  17. [GYCTF2020]Blacklist 1
  18. 《安富莱嵌入式周报》第248期:2022.01.10--2022.01.16
  19. Fabric学习笔记——一、环境搭建(小白入门)
  20. (附源码)springboot建材市场销售管理系统 毕业设计 191544

热门文章

  1. 如何解决空虚感?(转)
  2. 【转】linux/unix下 pid文件作用浅析
  3. 升级指南:将 SharePoint Portal Server 2003 升级到 Office SharePoint Server 2007
  4. 乌托邦式的经理人日记——小的奖励激发员工热情
  5. sm总线控制器找不到驱动程序_细说嵌入式系统下的驱动程序设计
  6. rn代码与android,RN与原生通讯(安卓篇)
  7. oracle 视图去重复,CSS_Oracle几种查找和删除重复记录的方法总结,平时工作中可能会遇到当试图 - phpStudy...
  8. python 显示中文_Python|绘制个性化数据的动态图表及解决中文显示问题……
  9. python按键暂停程序_汇总程序员学习python必备的42个快捷键,看完收获满满
  10. swing怎么监听其他类的按钮_舍得酒因资金违规占用被ST,“其他类风险”爆雷到底怎么防?...