Android读取/dev/graphics/fb0 屏幕截图
16lz
2021-01-26
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
调用时候需要先init 然后在shoot
更多相关文章
- 【Android开发经验】兼容不同的屏幕大小(推荐,最官方的适应屏幕大
- android屏幕分辨率分类
- Android(安卓)数据显示在屏幕上
- Android(安卓)Studio FFmpeg视频解码播放
- Android在诸如editText等组件设置输入法半屏幕显示的说明
- Android系统自带录屏(动态截屏)功能
- 获取手机屏幕大小
- 始终悬浮在Android屏幕的弹窗
- Android(安卓)Density