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

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

1. Activity文件

[java] view plain copy print ?
  1. packagecom.arvinhe.testscreenshot;
  2. importandroid.app.Activity;
  3. importandroid.content.Context;
  4. importandroid.graphics.Bitmap;
  5. importandroid.graphics.Canvas;
  6. importandroid.graphics.Matrix;
  7. importandroid.os.Bundle;
  8. importandroid.util.DisplayMetrics;
  9. importandroid.view.Display;
  10. importandroid.view.Surface;
  11. importandroid.view.View;
  12. importandroid.view.WindowManager;
  13. importandroid.view.View.OnClickListener;
  14. importandroid.widget.Button;
  15. importandroid.widget.ImageView;
  16. publicclassTestScreenShotActivityextendsActivityimplementsOnClickListener{
  17. privateImageViewimg_display;
  18. privateButtonbt_screenshot;
  19. privateDisplaymDisplay;
  20. privateDisplayMetricsmDisplayMetrics;
  21. privateMatrixmDisplayMatrix;
  22. privateBitmapmScreenBitmap;
  23. privateWindowManagermWindowManager;
  24. @Override
  25. publicvoidonCreate(BundlesavedInstanceState){
  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=newMatrix();
  32. mWindowManager=(WindowManager)this.getSystemService(Context.WINDOW_SERVICE);
  33. mDisplay=mWindowManager.getDefaultDisplay();
  34. mDisplayMetrics=newDisplayMetrics();
  35. mDisplay.getRealMetrics(mDisplayMetrics);
  36. }
  37. @Override
  38. publicvoidonClick(Viewv){
  39. if(v.equals(bt_screenshot)){
  40. mDisplay.getRealMetrics(mDisplayMetrics);
  41. float[]dims={mDisplayMetrics.widthPixels,mDisplayMetrics.heightPixels};
  42. floatdegrees=getDegreesForRotation(mDisplay.getRotation());
  43. booleanrequiresRotation=(degrees>0);
  44. if(requiresRotation){
  45. //Getthedimensionsofthedeviceinitsnativeorientation
  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. //Rotatethescreenshottothecurrentorientation
  55. Bitmapss=Bitmap.createBitmap(mDisplayMetrics.widthPixels,
  56. mDisplayMetrics.heightPixels,Bitmap.Config.ARGB_8888);
  57. Canvasc=newCanvas(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. //Ifwecouldn'ttakethescreenshot,notifytheuser
  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. *@returnthecurrentdisplayrotationindegrees
  77. */
  78. privatefloatgetDegreesForRotation(intvalue){
  79. switch(value){
  80. caseSurface.ROTATION_90:
  81. return360f-90f;
  82. caseSurface.ROTATION_180:
  83. return360f-180f;
  84. caseSurface.ROTATION_270:
  85. return360f-270f;
  86. }
  87. return0f;
  88. }
  89. }

2. AndroidManifest.xml文件

[html] view plain copy print ?
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <manifestxmlns: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-sdkandroid: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. <actionandroid:name="android.intent.action.MAIN"/>
  16. <categoryandroid:name="android.intent.category.LAUNCHER"/>
  17. </intent-filter>
  18. </activity>
  19. </application>
  20. </manifest>

3. Layout文件

[html] view plain copy print ?
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns: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="ScreenShot"
  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. IDevicedevice;
  2. AndroidDebugBridgebridge=AndroidDebugBridge.createBridge();
  3. waitDeviceList(bridge);
  4. IDevicedevices[]=bridge.getDevices();
  5. device=devices[0];

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

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

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

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

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

[java] view plain copy
  1. if(rawScreen!=null){
  2. BufferedImageimage=null;
  3. intwidth2=landscape?rawScreen.height:rawScreen.width;
  4. intheight2=landscape?rawScreen.width:rawScreen.height;
  5. if(image==null){
  6. image=newBufferedImage(width2,height2,
  7. BufferedImage.TYPE_INT_RGB);
  8. }else{
  9. if(image.getHeight()!=height2||image.getWidth()!=width2){
  10. image=newBufferedImage(width2,height2,
  11. BufferedImage.TYPE_INT_RGB);
  12. }
  13. }
  14. intindex=0;
  15. intindexInc=rawScreen.bpp>>3;
  16. for(inty=0;y<rawScreen.height;y++){
  17. for(intx=0;x<rawScreen.width;x++,index+=indexInc){
  18. intvalue=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",newFile("D:/temp.jpg"));
  26. }


更多相关文章

  1. 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
  2. PopupWindow位置
  3. android 点击桌面图标,打开手机浏览器进入相应的网站
  4. android seekbar使用
  5. Android(安卓)摄像头自动对焦的几点注意
  6. Android(安卓)- SharedPreferences 数据存储
  7. Android常用工具库
  8. Android(安卓)Studio 设置内存大小及原理
  9. AlertDialog使用自定义的布局

随机推荐

  1. Android(安卓)Camera 运行流程
  2. 将Gsensor lis301 driver 升级到 lis331
  3. [置顶] Android中一些优秀的博文(看过的)
  4. 在android中读取联系人信息的程序,包括读
  5. 让组件悬浮所有页面之上
  6. Android(安卓)炫酷的自定义进度条Progres
  7. Android(安卓)源码的建造者模式
  8. android 玩愤怒的小鸟等游戏的时候全屏TP
  9. Js Android(安卓)交互
  10. Android中的Service使用