Android读取/dev/graphics/fb0 屏幕截图
Android屏幕截图有很多方式这里只使用其中一种截图
主要是读取/dev/graphics/fb0,进行转换,复杂点就在如何把读取的数据进行转换。
可以参考一下这篇文章:http://blog.chinaaet.com/detail/28298
下面给出程序代码
/** * ScreenShotFb.java * 版权所有(C) 2014 * 创建者:cuiran 2014-4-3 下午4:55:23 */ package com.ghyf.mplay.util; import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import com.ghyf.mplay.value.ConstantValue; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.PixelFormat; import android.util.DisplayMetrics; import android.view.Display; /** * FrameBuffer中获取Android屏幕截图 * @author cuiran * @version 1.0.0 */ public class ScreenShotFb { private static final String TAG="ScreenShotFb"; final static String FB0FILE1 = "/dev/graphics/fb0"; static File fbFile; //程序入口 public static void shoot(){ try { /************ 创建锁对象 ************/ final Object lock = new Object(); synchronized (lock) { long start=System.currentTimeMillis(); Bitmap bitmap=getScreenShotBitmap(); long end=System.currentTimeMillis(); LogUtil.i(TAG, "getScreenShotBitmap time is :"+(end-start)+" ms"); String filePath= ConstantValue.ROOT_SDCARD_DIR+"/s.png"; // String filePath= ConstantValue.ROOT_SDCARD_DIR+"/screens/"+System.currentTimeMillis()+".png"; ScreenShotFb.savePic(bitmap,filePath); } }catch (Exception e) { LogUtil.e(TAG, "Exception error",e); } } //保存到sdcard public static void savePic(Bitmap b,String strFileName){ FileOutputStream fos = null; try { fos = new FileOutputStream(strFileName); if (null != fos) { b.compress(Bitmap.CompressFormat.PNG, 50, fos); fos.flush(); fos.close(); } } catch (FileNotFoundException e) { LogUtil.e(TAG, "FileNotFoundException error",e); } catch (IOException e) { LogUtil.e(TAG, "IOException error",e); } LogUtil.i(TAG, "savePic success"); } public static void init(Activity activity){ try { DisplayMetrics dm = new DisplayMetrics(); Display display = activity.getWindowManager().getDefaultDisplay(); display.getMetrics(dm); screenWidth = dm.widthPixels; // 屏幕宽(像素,如:480px) screenHeight = dm.heightPixels; // 屏幕高(像素,如:800p) int pixelformat = display.getPixelFormat(); PixelFormat localPixelFormat1 = new PixelFormat(); PixelFormat.getPixelFormatInfo(pixelformat, localPixelFormat1); int deepth = localPixelFormat1.bytesPerPixel;// 位深 LogUtil.i(TAG, "deepth="+deepth); piex = new byte[screenHeight * screenWidth*deepth] ;// 像素 colors = new int[screenHeight * screenWidth]; }catch(Exception e){ LogUtil.e(TAG, "Exception error",e); } } static DataInputStream dStream=null; static byte[] piex=null; static int[] colors =null; static int screenWidth; static int screenHeight; public static synchronized Bitmap getScreenShotBitmap() { FileInputStream buf = null; try { fbFile = new File(FB0FILE1); buf = new FileInputStream(fbFile);// 读取文件内容 dStream=new DataInputStream(buf); dStream.readFully(piex); dStream.close(); // 将rgb转为色值 for(int i=0;i<piex.length;i+=2) { colors[i/2]= (int)0xff000000 + (int) (((piex[i+1]) << (16))&0x00f80000)+ (int) (((piex[i+1]) << 13)&0x0000e000)+ (int) (((piex[i]) << 5)&0x00001A00)+ (int) (((piex[i]) << 3)&0x000000f8); } // 得到屏幕bitmap return Bitmap.createBitmap(colors, screenWidth, screenHeight, Bitmap.Config.RGB_565); } catch (FileNotFoundException e) { LogUtil.e(TAG, "FileNotFoundException error",e); } catch (IOException e) { LogUtil.e(TAG, "IOException error",e); }catch (Exception e) { LogUtil.e(TAG, "Exception error",e); } finally { if(buf!=null){ try { buf.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } return null; } }
调用时候需要先init 然后在shoot
看到很多朋友咨询得到的数据花屏和数组越界
这里跟设备的设备的位深和像素有关 需要修改这些代码。
// 将rgb转为色值
for(int i=0;i<piex.length;i+=2)
{
colors[i/2]= (int)0xff000000 +
(int) (((piex[i+1]) << (16))&0x00f80000)+
(int) (((piex[i+1]) << 13)&0x0000e000)+
(int) (((piex[i]) << 5)&0x00001A00)+
(int) (((piex[i]) << 3)&0x000000f8);
}
Android读取/dev/graphics/fb0 屏幕截图的更多相关文章
- 同步手绘板——关于/dev/graphics/fb0权限的获取
需要先将手机进行root,接着通过代码将/dev/graphics/fb0文件修改为可读的权限
- Android 读取Assets下的资源文件
做Android开发近半年了,东西越学越多,硬盘容量越来越小.很多东西找起来也不方便,为此,我打算从今天起把工作中学到的东西整理起来,写成日记.也希望与广大网友分享我的经验.一同进步.今天主要介绍文件 ...
- Android读取自定义View属性
Android读取自定义View属性 attrs.xml : <?xml version="1.0" encoding="utf-8"?> < ...
- Android udev /dev 设备节点权限
/************************************************************************* * Android udev /dev 设备节点权 ...
- Android读取JSON格式数据
Android读取JSON格式数据 1. 何为JSON? JSON,全称为JavaScript Object Notation,意为JavaScript对象表示法. JSON 是轻量级的文本数据交换格 ...
- Android - 读取JSON文件数据
Android读取JSON文件数据 JSON - JavaScript Object Notation 是一种存储和交换文本信息的语法. JSON对象在花括号中书写.用逗号来分隔值. JSON数组在方 ...
- Android 读取assets文件下的txt文件
android 读取assets文件下的txt文件,解决了读取txt文件的乱码问题: package com.example.com.scrollview; import java.io.Buffer ...
- Android读取asserts和raw文件夹下的文件
Android读取asserts和raw文件夹下的文件 经常需要用到读取“/res/raw”和"/asserts"文件夹下的文件,索性写成工具类方便以后使用. 一.raw文件夹下的 ...
- MTK Android 读取SIM卡参数,获取sim卡运营商信息
android 获取sim卡运营商信息(转) TelephonyManager tm = (TelephonyManager)Context.getSystemService(Context.TE ...
随机推荐
- 第四周小组作业:Wordcount优化
1.小组github地址 https://github.com/muzhailong/wcPro 2.PSP表格 PSP2.1 PSP阶段 预计耗时(分钟) 实际耗时(分钟) Planning 计划 ...
- consul怎么在windows下安装
1.去官网下载:https://www.consul.io/downloads.html 2.解压: 3.设置环境变量:path添加 E:\programfiles\consul: 4.cmd启动: ...
- 吴恩达深度学习第1课第3周编程作业记录(2分类1隐层nn)
2分类1隐层nn, 作业默认设置: 1个输出单元, sigmoid激活函数. (因为二分类); 4个隐层单元, tanh激活函数. (除作为输出单元且为二分类任务外, 几乎不选用 sigmoid 做激 ...
- centos 6安装 H3C iNode 上网客户端
我的安装目录是/usr/iNode 直接把客户端安装包拷到这个文件夹下然后解压: #rar x iNode2.-R0162.rar 然后进入文件夹,里边有一个install.sh文件,这是一个安装文件 ...
- Qt与FFmpeg联合开发指南(二)——解码(2):封装和界面设计
与解码相关的主要代码在上一篇博客中已经做了介绍,本篇我们会先讨论一下如何控制解码速度再提供一个我个人的封装思路.最后回归到界面设计环节重点看一下如何保证播放器界面在缩放和拖动的过程中保证视频画面的宽高 ...
- Swift基础之实现选择图片时,出现类似于ActionSheet的样式
之前看到过有APP在选择图片时,调用手机相册时,将手机相册做成了左右滑动选择的效果,这次展示的就是这种样式,用OC语言已经有人实现过类似的代码,在这里写的仅仅是效果展示的代码调用,具体代码,可以自己研 ...
- DB2 911错误的解释
SQL0911N 因为死锁或超时,所以当前事务已回滚.原因码为 "<原因码>". 说明: 当前工作单元参与了未解决的对象争用,因此必须回滚. 原因码如下所示: 2 ...
- java http post tomcat解除 长度限制
1. Get方法长度限制 Http Get方法提交的数据大小长度并没有限制,HTTP协议规范没有对URL长度进行限制.这个限制是特定的浏览器及服务器对它的限制. 如:IE对URL长度的限制是20 ...
- linux C 获取与修改IP地址
主要有两种方法: 一种是用system执行shell命令,如: system("ifconfig usb0 192.168.1.188"); 另一种用ioctl系统调用: int ...
- GDALWarp设置GDALWarpOptions::dfWarpMemoryLimit过大时处理失败
使用GDALWarp写了一个裁切图像的算法,在小内存的电脑没事,大内存的电脑就处理失败(32位也没问题),查看GDAL的日志发现下面的错误信息: Fri Apr 08 17:39:02 2016: G ...