`
20386053
  • 浏览: 430358 次
文章分类
社区版块
存档分类
最新评论

【Android应用开发】-(13)屏幕截图功能--截取全屏,无需Root(附源码)

 
阅读更多

转载出处:http://www.blog.csdn.net/tangcheng_ok

由于要做说明书,或者给客户看效果图,不得不通过截图的方式把屏幕接下来(当然了,还可以通过拍照来达到目的)。于是就Google找到一些需要Root权限,和不需要Root权限的截图应用,有些失望,多数不可用。于是就想自己开发一个截图的应用。在View 中提供一个getDrawingCache的方法,可以通过次方法获取View的截屏,但仅仅是截取View的。如果要截取状态栏呢?

其实不然,在ICS中的SystemUI就实现了截图的功能,按组合键Power+Volume Add/Volume sub就能截取图片。代码目录:
frameworks/base/packages/SystemUI/src/com/android/systemui/screenshot/在此目录下就两个文件,主要的截图方法在GlobalScreenshot中,本文就通过移植SystemUI中截图的代码实现截图功能。

首先是直接移植SystemUI的代码,实现截图效果,这部分的代码就不贴出来了,直接去下载代码吧, 关键的代码没有几句,最最主要的是:Surface.screenshot(),请看代码吧。

  1. <spanstyle="font-size:16px;">packageorg.winplus.ss;
  2. importjava.io.File;
  3. importjava.io.FileNotFoundException;
  4. importjava.io.FileOutputStream;
  5. importjava.io.IOException;
  6. importjava.text.SimpleDateFormat;
  7. importjava.util.Date;
  8. importandroid.app.Activity;
  9. importandroid.content.Context;
  10. importandroid.graphics.Bitmap;
  11. importandroid.graphics.Canvas;
  12. importandroid.graphics.Matrix;
  13. importandroid.os.Bundle;
  14. importandroid.util.DisplayMetrics;
  15. importandroid.util.Log;
  16. importandroid.view.Display;
  17. importandroid.view.Surface;
  18. importandroid.view.WindowManager;
  19. importandroid.os.SystemProperties;
  20. publicclassSimpleScreenshotActivityextendsActivity{
  21. privateDisplaymDisplay;
  22. privateWindowManagermWindowManager;
  23. privateDisplayMetricsmDisplayMetrics;
  24. privateBitmapmScreenBitmap;
  25. privateMatrixmDisplayMatrix;
  26. @Override
  27. publicvoidonCreate(BundlesavedInstanceState){
  28. super.onCreate(savedInstanceState);
  29. setContentView(R.layout.main);
  30. newThread(newRunnable(){
  31. @Override
  32. publicvoidrun(){
  33. takeScreenshot();
  34. }
  35. }).start();
  36. }
  37. privatefloatgetDegreesForRotation(intvalue){
  38. switch(value){
  39. caseSurface.ROTATION_90:
  40. return360f-90f;
  41. caseSurface.ROTATION_180:
  42. return360f-180f;
  43. caseSurface.ROTATION_270:
  44. return360f-270f;
  45. }
  46. return0f;
  47. }
  48. privatevoidtakeScreenshot(){
  49. mWindowManager=(WindowManager)getSystemService(Context.WINDOW_SERVICE);
  50. mDisplay=mWindowManager.getDefaultDisplay();
  51. mDisplayMetrics=newDisplayMetrics();
  52. mDisplay.getRealMetrics(mDisplayMetrics);
  53. mDisplayMatrix=newMatrix();
  54. float[]dims={mDisplayMetrics.widthPixels,
  55. mDisplayMetrics.heightPixels};
  56. intvalue=mDisplay.getRotation();
  57. StringhwRotation=SystemProperties.get("ro.sf.hwrotation","0");
  58. if(hwRotation.equals("270")||hwRotation.equals("90")){
  59. value=(value+3)%4;
  60. }
  61. floatdegrees=getDegreesForRotation(value);
  62. booleanrequiresRotation=(degrees>0);
  63. if(requiresRotation){
  64. //Getthedimensionsofthedeviceinitsnativeorientation
  65. mDisplayMatrix.reset();
  66. mDisplayMatrix.preRotate(-degrees);
  67. mDisplayMatrix.mapPoints(dims);
  68. dims[0]=Math.abs(dims[0]);
  69. dims[1]=Math.abs(dims[1]);
  70. }
  71. mScreenBitmap=Surface.screenshot((int)dims[0],(int)dims[1]);
  72. if(requiresRotation){
  73. //Rotatethescreenshottothecurrentorientation
  74. Bitmapss=Bitmap.createBitmap(mDisplayMetrics.widthPixels,
  75. mDisplayMetrics.heightPixels,Bitmap.Config.ARGB_8888);
  76. Canvasc=newCanvas(ss);
  77. c.translate(ss.getWidth()/2,ss.getHeight()/2);
  78. c.rotate(degrees);
  79. c.translate(-dims[0]/2,-dims[1]/2);
  80. c.drawBitmap(mScreenBitmap,0,0,null);
  81. c.setBitmap(null);
  82. mScreenBitmap=ss;
  83. }
  84. //Ifwecouldn'ttakethescreenshot,notifytheuser
  85. if(mScreenBitmap==null){
  86. return;
  87. }
  88. //Optimizations
  89. mScreenBitmap.setHasAlpha(false);
  90. mScreenBitmap.prepareToDraw();
  91. try{
  92. saveBitmap(mScreenBitmap);
  93. }catch(IOExceptione){
  94. System.out.println(e.getMessage());
  95. }
  96. }
  97. publicvoidsaveBitmap(Bitmapbitmap)throwsIOException{
  98. StringimageDate=newSimpleDateFormat("yyyy-MM-dd-HH-mm-ss")
  99. .format(newDate(System.currentTimeMillis()));
  100. Filefile=newFile("/mnt/sdcard/Pictures/"+imageDate+".png");
  101. if(!file.exists()){
  102. file.createNewFile();
  103. }
  104. FileOutputStreamout;
  105. try{
  106. out=newFileOutputStream(file);
  107. if(bitmap.compress(Bitmap.CompressFormat.PNG,70,out)){
  108. out.flush();
  109. out.close();
  110. }
  111. }catch(FileNotFoundExceptione){
  112. e.printStackTrace();
  113. }catch(IOExceptione){
  114. e.printStackTrace();
  115. }
  116. }
  117. }
  118. </span>

PS:1、需要在AndroidManifest.xml中加入代码:android:sharedUserId="android.uid.system"

2、由于调用了@hide的API,所以编译得时候请使用makefile编译。或者通过在Eclipse中添加Jar文件通过编译。

3、此代码只在Android4.0中使用过,2.3的就没去做测试了。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics