• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > getDrawingCache()和Android中的截图方法简介

getDrawingCache()和Android中的截图方法简介

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了getdrawingcache,view.getdrawingcache,getdrawingcache null,v.getdrawingcache,android简介等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

getDrawingCache()和Android中的截图方法简介


getDrawingCache()方法截取部分屏幕:

view.setDrawingCacheEnabled(true);//设置能否缓存图片信息(drawing cache)
view.buildDrawingCache();//如果能够缓存图片,则创建图片缓存
Bitmap bitmap = view.getDrawingCache();//如果图片已经缓存,返回一个bitmap

view.destroyDrawingCache();//释放缓存占用的资源

Tips:

如果在一个界面中,重复截取图片,在每次截屏之前,都应该清除缓存;

假如图片不符合我们的要求,可以使用Bitmap.createBitmap( )方法处理图片(图片压缩过度,会致使不能显示);

图片本地存储

File f = new File(" ");
try {
    f.createNewFile();
} catch (IOException e1) {
    e1.printStackTrace();
}
FileOutputStream fOut = null;
try {
    fOut = new FileOutputStream(f);
} catch (FileNotFoundException e) {
    e.printStackTrace();
}
mBitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);
try {
    fOut.flush();
} catch (IOException e) {
    e.printStackTrace();
}
try {
    fOut.close();
} catch (IOException e) {
    e.printStackTrace();
}

其他截屏方法

1、在APK中调用“adb shell screencap -pfilepath” 命令(基于Android SDK的截屏方法)

该命令读取系统的framebuffer,需要获得系统权限:
(1). 在AndroidManifest.xml文件中添加


(2). 修改APK为系统权限,将APK放到源码中编译, 修改Android.mk

LOCAL_CERTIFICATE := platform

publicvoid takeScreenShot(){ 
    String mSavedPath = Environment.getExternalStorageDirectory()+File. separator + "screenshot.png" ; 
try {                     
           Runtime. getRuntime().exec("screencap -p " + mSavedPath); 
    } catch (Exception e) { 
           e.printStackTrace(); 
    } 

2、利用系统的API,实现Screenshot,这部分代码是系统隐藏的,需要在源码下编译(基于Android SDK的截屏方法)

(1). 在AndroidManifest.xml文件中添加


(2). 修改APK为系统权限,将APK放到源码中编译, 修改Android.mk

LOCAL_CERTIFICATE := platform

public boolean takeScreenShot(String imagePath){



             if(imagePath.equals("" )){
                      imagePath = Environment.getExternalStorageDirectory()+File. separator+"Screenshot.png" ;
             }

          Bitmap mScreenBitmap;
          WindowManager mWindowManager;
          DisplayMetrics mDisplayMetrics;
          Display mDisplay;

          mWindowManager = (WindowManager) mcontext.getSystemService(Context.WINDOW_SERVICE);
          mDisplay = mWindowManager.getDefaultDisplay();
          mDisplayMetrics = new DisplayMetrics();
          mDisplay.getRealMetrics(mDisplayMetrics);

          float[] dims = {mDisplayMetrics.widthPixels , mDisplayMetrics.heightPixels };
          mScreenBitmap = Surface. screenshot((int) dims[0], ( int) dims[1]);

          if (mScreenBitmap == null) {  
                 return false ;
          }

       try {
          FileOutputStream out = new FileOutputStream(imagePath);
          mScreenBitmap.compress(Bitmap.CompressFormat. PNG, 100, out);

        } catch (Exception e) {


          return false ;
        }       

       return true ;
}

基于Android ddmlib进行截屏

public class ScreenShot {  
 private BufferedImage image = null;  
 /** 
  * @param args 
  */  
 public static void main(String[] args) {  
  // TODO Auto-generated method stub  
  AndroidDebugBridge.init(false); //  
  ScreenShot screenshot = new ScreenShot();  
  IDevice device = screenshot.getDevice();  

  for (int i = 0; i < 10; i++) {  
   Date date=new Date();  
   SimpleDateFormat df=new SimpleDateFormat("MM-dd-HH-mm-ss");   
   String nowTime = df.format(date);  
   screenshot.getScreenShot(device, "Robotium" + nowTime);  
   try {  
    Thread.sleep(1000);  
   } catch (InterruptedException e) {  
    // TODO Auto-generated catch block  
    e.printStackTrace();  
   }  
  }  
 }  


 public void getScreenShot(IDevice device,String filename) {  
  RawImage rawScreen = null;  
  try {  
   rawScreen = device.getScreenshot();  
  } catch (TimeoutException e) {  
   // TODO Auto-generated catch block  
   e.printStackTrace();  
  } catch (AdbCommandRejectedException e) {  
   // TODO Auto-generated catch block  
   e.printStackTrace();  
  } catch (IOException e) {  
   // TODO Auto-generated catch block  
   e.printStackTrace();  
  }  
  if (rawScreen != null) {  
   Boolean landscape = false;  
   int width2 = landscape ? rawScreen.height : rawScreen.width;  
   int height2 = landscape ? rawScreen.width : rawScreen.height;  
   if (image == null) {  
    image = new BufferedImage(width2, height2,  
      BufferedImage.TYPE_INT_RGB);  
   } else {  
    if (image.getHeight() != height2 || image.getWidth() != width2) {  
     image = new BufferedImage(width2, height2,  
       BufferedImage.TYPE_INT_RGB);  
    }  
   }  
   int index = 0;  
   int indexInc = rawScreen.bpp >> 3;  
   for (int y = 0; y < rawScreen.height; y++) {  
    for (int x = 0; x < rawScreen.width; x++, index += indexInc) {  
     int value = rawScreen.getARGB(index);  
     if (landscape)  
      image.setRGB(y, rawScreen.width - x - 1, value);  
     else  
      image.setRGB(x, y, value);  
    }  
   }  
   try {  
    ImageIO.write((RenderedImage) image, "PNG", new File("D:/"  
      + filename + ".jpg"));  
   } catch (IOException e) {  
    // TODO Auto-generated catch block  
    e.printStackTrace();  
   }  
  }  
 }  

 /** 
  * 获取得到device对象 
  * @return 
  */  
 private IDevice getDevice(){  
  IDevice device;  
  AndroidDebugBridge bridge = AndroidDebugBridge  
    .createBridge("adb", true);//如果代码有问题请查看API,修改此处的参数值试一下  
  waitDevicesList(bridge);  
  IDevice devices[] = bridge.getDevices();  
  device = devices[0];  
  return device;  
 }  

 /** 
  * 等待查找device 
  * @param bridge 
  */  
 private void waitDevicesList(AndroidDebugBridge bridge) {  
  int count = 0;  
  while (bridge.hasInitialDeviceList() == false) {  
   try {  
    Thread.sleep(500);   
    count++;  
   } catch (InterruptedException e) {  
   }  
   if (count > 240) {  
    System.err.print("等待获取设备超时");  
    break;  
   }  
  }  
 }  

Android本地编程(Native Programming)读取framebuffer

(1)命令行,框架的截屏功能是通过framebuffer来实现的,所以我们先来介绍一下framebuffer。

framebuffer介绍
帧缓冲(framebuffer)是Linux为显示设备提供的一个接口,把显存抽象后的一种设备,他允许上层应用程序在图形模式下直接对显示缓冲区进行 读写操作。这种操作是抽象的,统一的。用户不必关心物理显存的位置、换页机制等等具体细节。这些都是由Framebuffer设备驱动来完成的。
Linux FrameBuffer 本质上只是提供了对图形设备的硬件抽象,在开发者看来,FrameBuffer 是一块显示缓存,往显示缓存中写入特定格式的数据就意味着向屏幕输出内容。所以说FrameBuffer就是一块白板。例如对于初始化为16 位色的FrameBuffer 来说, FrameBuffer中的两个字节代表屏幕上一个点,从上到下,从左至右,屏幕位置与内存地址是顺序的线性关系。
帧缓存有个地址,是在内存里。我们通过不停的向frame buffer中写入数据, 显示控制器就自动的从frame buffer中取数据并显示出来。全部的图形都共享内存中同一个帧缓存。

Android截屏实现思路
Android系统是基于Linux内核的,所以也存在framebuffer这个设备,我们要实现截屏的话只要能获取到framebuffer中的数据,然后把数据转换成图片就可以了,android中的framebuffer数据是存放在 /dev/graphics/fb0 文件中的,所以我们只需要来获取这个文件的数据就可以得到

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 解析View的getDrawingCache方法,getdrawingcache
  • getDrawingCache()和Android中的截图方法简介

相关文章

  • 2017-05-26andriod 获取电池的信息,andriod获取电池
  • 2017-05-26Android定位&amp;地图&amp;导航——基于百度地图移动获取位置和自动定位,android定位城市
  • 2017-05-222.3.3 Button(按钮)与ImageButton(图像按钮)
  • 2017-05-26测试新建博文,新建博文
  • 2017-05-26nagios分组出图代码实现讲解[1]
  • 2017-05-2627个漂亮的移动端注册/登录界面设计作品,27登录界面设计作品
  • 2017-05-26achartengine/MPAndroidChart——图表实现之Java
  • 2017-05-26编译器开发系列--Ocelot语言1.抽象语法树,--ocelot语法
  • 2017-05-222.5.6 ViewFlipper(翻转视图)的基本使用
  • 2017-05-26Android应用自定义View绘制方法手册

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • AndroidStudio下使用 RecyclerView xml文件不显示预览条目并报错类似:NoClassDefFoundError 问题解决,studiorecyclerview
    • 沉浸式状态栏与导航条,状态栏导航条
    • PostgreSql数据库的神器 FDW
    • android:省市二级联动下拉框
    • Android开发学习-view,android开发-view
    • 找不到draw9patch.bat?已经不用找了,draw9patch.bat
    • 安卓高级组件-----进度条,安卓-----进度条
    • Android实战技巧之五十一:libjpeg与Android
    • viewPager+fragment如何刷新缓存fragment,viewpagerfragment
    • React Native控件之PullToRefreshViewAndroid下拉刷新组件讲解

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有