方法一,根据android代码实现的流程在复制一遍,流程上一篇已经大概看过了,网上也有很多已经实现了。下面我就转载一篇

来自http://blog.csdn.net/hk_256

1. Activity文件

[java]  view plain copy print ?
  1. package com.arvinhe.testscreenshot;
  2. import android.app.Activity;
  3. import android.content.Context;
  4. import android.graphics.Bitmap;
  5. import android.graphics.Canvas;
  6. import android.graphics.Matrix;
  7. import android.os.Bundle;
  8. import android.util.DisplayMetrics;
  9. import android.view.Display;
  10. import android.view.Surface;
  11. import android.view.View;
  12. import android.view.WindowManager;
  13. import android.view.View.OnClickListener;
  14. import android.widget.Button;
  15. import android.widget.ImageView;
  16. public class TestScreenShotActivity extends Activity implements OnClickListener{
  17. private ImageView img_display;
  18. private Button bt_screenshot;
  19. private Display mDisplay;
  20. private DisplayMetrics mDisplayMetrics;
  21. private Matrix mDisplayMatrix;
  22. private Bitmap mScreenBitmap;
  23. private WindowManager mWindowManager;
  24. @Override
  25. public void onCreate(Bundle savedInstanceState) {
  26. super.onCreate(savedInstanceState);
  27. setContentView(R.layout.main);
  28. bt_screenshot = (Button)findViewById(R.id.bt_screenshot);
  29. img_display = (ImageView)findViewById(R.id.img_display);
  30. bt_screenshot.setOnClickListener(this);
  31. mDisplayMatrix = new Matrix();
  32. mWindowManager = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
  33. mDisplay = mWindowManager.getDefaultDisplay();
  34. mDisplayMetrics = new DisplayMetrics();
  35. mDisplay.getRealMetrics(mDisplayMetrics);
  36. }
  37. @Override
  38. public void onClick(View v) {
  39. if(v.equals(bt_screenshot)){
  40. mDisplay.getRealMetrics(mDisplayMetrics);
  41. float[] dims = {mDisplayMetrics.widthPixels, mDisplayMetrics.heightPixels};
  42. float degrees = getDegreesForRotation(mDisplay.getRotation());
  43. boolean requiresRotation = (degrees > 0);
  44. if (requiresRotation) {
  45. // Get the dimensions of the device in its native orientation
  46. mDisplayMatrix.reset();
  47. mDisplayMatrix.preRotate(-degrees);
  48. mDisplayMatrix.mapPoints(dims);
  49. dims[0] = Math.abs(dims[0]);
  50. dims[1] = Math.abs(dims[1]);
  51. }
  52. mScreenBitmap = Surface.screenshot((int) dims[0], (int) dims[1]);
  53. if (requiresRotation) {
  54. // Rotate the screenshot to the current orientation
  55. Bitmap ss = Bitmap.createBitmap(mDisplayMetrics.widthPixels,
  56. mDisplayMetrics.heightPixels, Bitmap.Config.ARGB_8888);
  57. Canvas c = new Canvas(ss);
  58. c.translate(ss.getWidth() / 2, ss.getHeight() / 2);
  59. c.rotate(degrees);
  60. c.translate(-dims[0] / 2, -dims[1] / 2);
  61. c.drawBitmap(mScreenBitmap, 0, 0, null);
  62. c.setBitmap(null);
  63. mScreenBitmap = ss;
  64. }
  65. // If we couldn't take the screenshot, notify the user
  66. if (mScreenBitmap == null) {
  67. return;
  68. }
  69. // Optimizations
  70. mScreenBitmap.setHasAlpha(false);
  71. mScreenBitmap.prepareToDraw();
  72. img_display.setImageBitmap(mScreenBitmap);
  73. }
  74. }
  75. /**
  76. * @return the current display rotation in degrees
  77. */
  78. private float getDegreesForRotation(int value) {
  79. switch (value) {
  80. case Surface.ROTATION_90:
  81. return 360f - 90f;
  82. case Surface.ROTATION_180:
  83. return 360f - 180f;
  84. case Surface.ROTATION_270:
  85. return 360f - 270f;
  86. }
  87. return 0f;
  88. }
  89. }

2. AndroidManifest.xml文件

[html]  view plain copy print ?
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.arvinhe.testscreenshot"
  4. android:versionCode="1"
  5. android:versionName="1.0"
  6. android:sharedUserId="android.uid.system">
  7. <uses-sdk android:minSdkVersion="15" />
  8. <application
  9. android:icon="@drawable/ic_launcher"
  10. android:label="@string/app_name" >
  11. <activity
  12. android:name=".TestScreenShotActivity"
  13. android:label="@string/app_name" >
  14. <intent-filter>
  15. <action android:name="android.intent.action.MAIN" />
  16. <category android:name="android.intent.category.LAUNCHER" />
  17. </intent-filter>
  18. </activity>
  19. </application>
  20. </manifest>

3. Layout文件

[html]  view plain copy print ?
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:orientation="vertical" >
  6. <TextView
  7. android:layout_width="fill_parent"
  8. android:layout_height="wrap_content"
  9. android:text="@string/hello" />
  10. <Button
  11. android:id="@+id/bt_screenshot"
  12. android:layout_width="fill_parent"
  13. android:layout_height="wrap_content"
  14. android:text="Screen Shot"
  15. />
  16. <ImageView
  17. android:id="@+id/img_display"
  18. android:layout_width="fill_parent"
  19. android:layout_height="wrap_content"
  20. android:src="@drawable/ic_launcher"/>
  21. </LinearLayout>

方法2,根据DDMS里的截图功能实现,也有现成的。

来自:http://blog.csdn.net/ericahdu/article/details/5533091

我们有时候只是需要截图,没必要连DDMS一起开,所以剥离了截图的代码,当然,并不是原生的啊,是根据原理自己写的,供大家参考

第一步,准备库包

我们既然是按照DDMS的方法截图,就需要用到ddmlib.jar这个包,它位于android的SDK目录的tools/lib下,我们需要把它加入到我们

的Eclipse工程的build path下。

第二步,建立连接,获取设备

有了ddmlib,我们就可以使用里面的 AndroidDebugBridge 类来获取已经同步的设备的列表并建立连接

[java] view plain copy
  1. IDevice device;
  2. AndroidDebugBridge bridge = AndroidDebugBridge.createBridge();
  3. waitDeviceList(bridge);
  4. IDevice devices[] = bridge.getDevices();
  5. device = devices[0];

上面的代码用到了一个waitDeviceList(bridge),主要是为了多次尝试连接,代码如下

[java] view plain copy
  1. private static void waitDeviceList(AndroidDebugBridge bridge) {
  2. int count = 0;
  3. while (bridge.hasInitialDeviceList() == false) {
  4. try {
  5. Thread.sleep(100); // 如果没有获得设备列表,则等待
  6. ount++;
  7. } catch (InterruptedException e) {}
  8. if (count > 300) {    // 设定时间超过300×100 ms的时候为连接超时
  9. System.err.print("Time out");
  10. break;
  11. }
  12. }
  13. }

这样我们就可以获得一个设备的类,IDevice,其中有一个getScreenshot()方法获得屏幕截图,类型为RawImage

[java] view plain copy
  1. RawImage rawScreen = device.getScreenshot();

后面的方法就和Android无关了,纯粹的转换,Rawimage转换到bufferedimage,再保存

[java] view plain copy
  1. if(rawScreen != null){
  2. BufferedImage image = null;
  3. int width2 = landscape ? rawScreen.height : rawScreen.width;
  4. int height2 = landscape ? rawScreen.width : rawScreen.height;
  5. if (image == null) {
  6. image = new BufferedImage(width2, height2,
  7. BufferedImage.TYPE_INT_RGB);
  8. } else {
  9. if (image.getHeight() != height2 || image.getWidth() != width2) {
  10. image = new BufferedImage(width2, height2,
  11. BufferedImage.TYPE_INT_RGB);
  12. }
  13. }
  14. int index = 0;
  15. int indexInc = rawScreen.bpp >> 3;
  16. for (int y = 0; y < rawScreen.height; y++) {
  17. for (int x = 0; x < rawScreen.width; x++, index += indexInc) {
  18. int value = rawScreen.getARGB(index);
  19. if (landscape)
  20. image.setRGB(y, rawScreen.width - x - 1, value);
  21. else
  22. image.setRGB(x, y, value);
  23. }
  24. }
  25. ImageIO.write((RenderedImage)image,"PNG",new File("D:/temp.jpg"));
  26. }

Android屏幕截图实现相关推荐

  1. android 屏幕截图检测,Android 屏幕截图

    Android 屏幕截图 04/08/2020 本文内容 如果你的 App Center 测试报表在 Android 上一致地显示了空白或打乱的屏幕截图,则通常是因为你的应用程序已禁用屏幕截图. 此 ...

  2. 从FrameBuffer中获取Android屏幕截图

    我们知道,DDMS可以很容易的获取Android 手机 的屏幕截图,那么它是怎么做到的呢? 其实,android手机上有一个叫做FrameBuffer的设备,图像信息都是通过FrameBuffer写到 ...

  3. android 屏幕截图并缩小 以及存取方法

    图片缩小并由Bitmap转换为Imageview方法 static Bitmap ViewToBit(Activity activity){         float scaleWidth = 1, ...

  4. Android 屏幕截图

    转自:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=96116&extra=page%3D1&ordertype ...

  5. Android 系统(227)---Android屏幕截图

    屏幕截图,亲测可用,基于Activity /*** 屏幕截图* @param activity* @return*/public static Bitmap screenShot(AppCompatA ...

  6. Android屏幕截图,View截图(干货)

    不多说废话,直接上代码 屏幕截图,亲测可用,基于Activity /*** 屏幕截图* @param activity* @return*/public static Bitmap screenSho ...

  7. Android 屏幕截图黑屏问题解决方法

    以下两种截屏方法可能由于尺寸没有设置默认过大系统不予处理. public static Bitmap convertViewToBitmap(View view, int bitmapWidth, i ...

  8. Android读取/dev/graphics/fb0 屏幕截图

    Android屏幕截图有很多方式这里只使用其中一种截图 主要是读取/dev/graphics/fb0,进行转换,复杂点就在如何把读取的数据进行转换. 可以参考一下这篇文章:http://blog.ch ...

  9. 如何以编程方式在Android上截屏?

    如何通过代码而不是通过任何程序来截屏电话屏幕的选定区域? #1楼 Mualig的回答很好,但是我遇到了Ewoks描述的相同问题,但我没有得到背景知识. 因此,有时足够好,有时我会在黑色背景上出现黑色文 ...

最新文章

  1. Appium自动化测试-iOS真机运行
  2. 以下哪一个不属于python语言的特点-以下不属于python语言特点的是( )_学小易找答案...
  3. python语言的翻译方式是什么-python自动翻译实现方法
  4. Vue.js 插件开发详解
  5. Silverlight 游戏开发小技巧:轨迹跟随效果
  6. DL之DeepLabv2:DeepLab v2算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
  7. FIFO分枝_限界算法
  8. Python安装FrankMocap实现3D人体姿态估计
  9. mysql not in 多列,MySQL中的多列外键?
  10. 关于idea的git账号与电脑的git账号不一致的问题。已解决!
  11. (转)Eclipse在线配置Hibernate Tools
  12. [SCSS] Pure CSS for multiline truncation with ellipsis
  13. 吴恩达神经网络和深度学习-学习笔记-44-anchor box
  14. 【Java程序设计】输入输出
  15. spss统计分析基础教程(上)--自学
  16. 使用_beginthread创建线程
  17. setlocale()函数详解——C语言
  18. GTD时间管理工具Omnifocus 3 Mac中文版
  19. OS学习笔记-4(清华大学慕课)mooc实验一
  20. thinkphp 框架 打开word文件的步骤

热门文章

  1. 基于matlab的ofdm系统仿真及性能分析,基于MATLAB的OFDM系统性能仿真
  2. MySQL连接Navicat
  3. Pycharm 金融Python实战二:用Python编写一个金融计算器——编写函数 调用命令 实例年金现值 利率换算 净现值法 投资回报期 内部收益率及其法则(带程序和结果)
  4. android开发的超级玛丽游戏
  5. server sql top速度变慢解决方案_SQL Server:执行计划教会我如何创建索引?(解决SQL加了TOP之后变很慢的问题)...
  6. Leetcode——507. Perfect Number
  7. CAD图纸可以进行哪些格式的转换呢?
  8. 国内CMS技术发展的外在表现形式
  9. iOS 非越狱下的代码注入
  10. 框架的概念框架(Framework)