1:效果如图

2:权限

  1. <uses-sdk
  2. android:minSdkVersion="21"
  3. android:targetSdkVersion="21" />
  4. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  5. <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
  6. tools:ignore="ProtectedPermissions" />
  7. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

  

3:实现

  1. public class MainActivity extends AppCompatActivity {
  2.  
  3. private static final String TAG = "TAGA";
  4. int x = 1;
  5. private static final int REQUEST_MEDIA_PROJECTION = 1;
  6. private MediaProjectionManager projectionManager;
  7. boolean screenCapture = false;
  8.  
  9. Handler mHandler = new Handler() {
  10. @TargetApi(Build.VERSION_CODES.LOLLIPOP)
  11. @Override
  12. public void handleMessage(Message msg) {
  13. super.handleMessage(msg);
  14. takeScreenshot2();
  15. }
  16. };
  17.  
  18. @Override
  19. protected void onCreate(Bundle savedInstanceState) {
  20. super.onCreate(savedInstanceState);
  21. setContentView(R.layout.activity_main);
  22. Button btn = findViewById(R.id.btn);
  23. btn.setOnClickListener(new View.OnClickListener() {
  24. @Override
  25. public void onClick(View v) {
  26. x=1;
  27. showAlertDialog();
  28. mHandler.sendEmptyMessageDelayed(100,1000);
  29. }
  30. });
  31.  
  32. }
  33.  
  34. @TargetApi(Build.VERSION_CODES.LOLLIPOP)
  35. @RequiresApi(api = Build.VERSION_CODES.KITKAT)
  36. @Override
  37. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  38.  
  39. if (requestCode == REQUEST_MEDIA_PROJECTION ) {
  40. try {
  41. final int mWidth = getWindowManager().getDefaultDisplay().getWidth();
  42. final int mHeight = getWindowManager().getDefaultDisplay().getHeight();
  43. final ImageReader mImageReader = ImageReader.newInstance(mWidth, mHeight, PixelFormat.RGBA_8888, 2);
  44. DisplayMetrics metrics = new DisplayMetrics();
  45. getWindowManager().getDefaultDisplay().getMetrics(metrics);
  46. int mScreenDensity = metrics.densityDpi;
  47. final MediaProjection mProjection = projectionManager.getMediaProjection(-1, data);
  48. final VirtualDisplay virtualDisplay = mProjection.createVirtualDisplay("screen-mirror",
  49. mWidth, mHeight, mScreenDensity, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
  50. mImageReader.getSurface(), null, null);
  51. mImageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {
  52. @Override
  53. public void onImageAvailable(ImageReader reader) {
  54. if (x != 1) {
  55. return;
  56. } else {
  57. try {
  58. /**
  59. * 去掉--->mProjection.stop(); 会出现不停的截图现象
  60. */
  61. x = 2;
  62. mProjection.stop();
  63. Image image = mImageReader.acquireLatestImage();
  64. final Image.Plane[] planes = image.getPlanes();
  65. final ByteBuffer buffer = planes[0].getBuffer();
  66. int offset = 0;
  67. int pixelStride = planes[0].getPixelStride();
  68. int rowStride = planes[0].getRowStride();
  69. int rowPadding = rowStride - pixelStride * mWidth;
  70. Bitmap bitmap = Bitmap.createBitmap(mWidth + rowPadding / pixelStride, mHeight, Bitmap.Config.ARGB_8888);
  71. bitmap.copyPixelsFromBuffer(buffer);
  72. image.close();
  73. // 保存路径
  74. String pathImage = Environment.getExternalStorageDirectory().getPath() + File.separator + "AA" + File.separator;
  75. String nameImage = pathImage+"截图示例.png";
  76. if (bitmap != null) {
  77. try {
  78. File fileImage = new File(nameImage);
  79. if (!fileImage.exists()) {
  80. fileImage.createNewFile();
  81. }
  82. FileOutputStream out = new FileOutputStream(fileImage);
  83. if (out != null) {
  84. bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
  85. out.flush();
  86. out.close();
  87. Toast.makeText(MainActivity.this, "图片保存成功!", Toast.LENGTH_SHORT).show();
  88. Intent media = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
  89. Uri contentUri = Uri.fromFile(fileImage);
  90. media.setData(contentUri);
  91. getApplicationContext().sendBroadcast(media);
  92. screenCapture = false;
  93. }
  94. } catch (FileNotFoundException e) {
  95. e.printStackTrace();
  96. } catch (IOException e) {
  97. e.printStackTrace();
  98. }
  99. } else {
  100. Toast.makeText(MainActivity.this, "cannot get phone's screen", Toast.LENGTH_SHORT).show();
  101.  
  102. }
  103. } catch (Exception e) {
  104. e.printStackTrace();
  105. }
  106. }
  107.  
  108. }
  109. }, null);
  110. } catch (Exception e) {
  111. e.printStackTrace();
  112. }
  113.  
  114. }
  115.  
  116. }
  117.  
  118. /**
  119. * 截图功能调用
  120. */
  121.  
  122. @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
  123. public void takeScreenshot2() {
  124. try {
  125. projectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
  126. startActivityForResult(
  127. projectionManager.createScreenCaptureIntent(),
  128. REQUEST_MEDIA_PROJECTION);
  129. } catch (Exception e) {
  130. e.printStackTrace();
  131. }
  132. }
  133.  
  134. public void showAlertDialog() {
  135. AlertDialog.Builder localBuilder = new AlertDialog.Builder(this);
  136. localBuilder.setTitle("简单对话框");
  137. localBuilder.setIcon(R.mipmap.ic_launcher);
  138. localBuilder.setMessage("提示信息?");
  139. localBuilder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
  140. public void onClick(DialogInterface paramAnonymousDialogInterface, int paramAnonymousInt) {
  141. /**
  142. * 确定操作
  143. * */
  144. }
  145. });
  146. localBuilder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
  147. public void onClick(DialogInterface paramAnonymousDialogInterface, int paramAnonymousInt) {
  148. /**
  149. * 确定操作
  150. * */
  151. }
  152. });
  153.  
  154. /***
  155. * 设置点击返回键不会消失
  156. * */
  157. localBuilder.setCancelable(false).create();
  158.  
  159. localBuilder.show();
  160. }
  161. }

  

Android截图截取弹框AlertDialog的更多相关文章

  1. android之自定义弹框

    step1 创建窗体 final AlertDialog dialog =new Builder(this).create(); step2 获取View View viewDialog =View. ...

  2. android 自定义弹出框AlertDialog ,很炫的哦

      于是就小小的模仿了下自己写了这个这样的效果,主要代码如下:dlg = new AlertDialog.Builder(context).create();dlg.show();dlg.getWin ...

  3. android 三种弹出框之一PopupWindow

    PopupWindow 在android的弹出框我目前了解到的是有三种:AlertDialog,PopupWindow,Activity伪弹框, AlertDialog太熟悉了,这里就不介绍了 就先看 ...

  4. android标题栏上面弹出提示框(二) PopupWindow实现,带动画效果

    需求:上次用TextView写了一个从标题栏下面弹出的提示框.android标题栏下面弹出提示框(一) TextView实现,带动画效果,  总在找事情做的产品经理又提出了奇葩的需求.之前在通知栏显示 ...

  5. android标题栏下面弹出提示框(一) TextView实现,带动画效果

    产品经理用的是ios手机,于是android就走上了模仿的道路.做这个东西也走了一些弯路,写一篇博客放在这里,以后自己也可用参考,也方便别人学习. 弯路: 1.刚开始本来用PopupWindow去实现 ...

  6. Android填坑系列:在小米系列等机型上放开定位权限后的定位请求弹框

    背景: 近期因实际项目需要,在特定操作下触发定位请求,取到用户位置及附近位置. 问题: 经初步选型,最终决定接入百度定位,按照百度定位SDK Android文档,接入过程相对顺利.但随后发现,在小米系 ...

  7. 弹框在UC浏览器或者Android机器上会被顶上去

    弹框在UC浏览器或者Android机器上会被顶上去 可以通过监听resize事件 this.height = $(document).height(); window.addEventListener ...

  8. 遇到的一个移动端从下往上过渡的弹框,在Android下过渡动画的优化问题。

    优化之前: /* 分享弹框样式 */ .popUpDiv { width: 100vw; height: 100vh; transition: all 0.5s ease; position: fix ...

  9. 考拉Android统一弹框

    作者:钱成杰 背景 在快速开发的背景下,经历了n个版本后的考拉Android App中已经存在了各种各样看似相同却各有差别的弹框样式.其中包括系统弹框和自定义弹框,并且在线上时常会出现IllegalA ...

随机推荐

  1. mysql中文乱码归纳总结

    今天使用sqlalchemy往mysql数据库里插入数据的时候,发生了错误,因为字段包含中文,所以报错.在问题解决之后做一个总结.   mysql中文乱码包括几个方面.mysql服务器层面.mysql ...

  2. MongoDB - 认识MongoDB及数据类型

    目录 MongoDB - 认识MongoDB及数据类型 启动 MogoDB的数据 MogoDB的数据类型 1.Object ID : Documents自生成的_id 2.string : 字符串,必 ...

  3. 腾讯云,搭建LAMP服务

    lamp (Web应用软件) 编辑 Linux+Apache+Mysql/MariaDB+Perl/PHP/Python一组常用来搭建动态网站或者服务器的开源软件,本身都是各自独立的程序,但是因为常被 ...

  4. Java基础学习总结(74)——Java常见笔试题及答案汇总

    1. 下面哪些是合法的标识符?(ABE )--标识符 A. $persons B. TwoUsers C. *point D. this E. _endline 2. 下面程序运行的结果是( D )- ...

  5. 接水问题(2010年NOIP全国联赛普及组)

    时间限制: 1 s    空间限制: 128000 KB 题目描述 Description 学校里有一个水房,水房里一共装有m 个龙头可供同学们打开水,每个龙头每秒钟的供水量相等,均为1. 现在有n ...

  6. hdu_2046_骨牌铺方格_201311251403

    骨牌铺方格 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  7. GDB 调试 PHP文件

    http://www.bo56.com/%E5%9C%A82016%E7%9A%84phpcon%E5%A4%A7%E4%BC%9A%E4%B8%8A%E7%9A%84%E5%88%86%E4%BA% ...

  8. 向Java枚举类型中加入新方法

    除了不能继承enum之外,可将其看做一个常规类.甚至能够有main方法. 注意:必须先定义enum实例.实例的最后有一个分号. 以下是一个样例:返回对实例自身的描写叙述,而非默认的toString返回 ...

  9. /usr/bin/ld: cannot find -lltdl collect2: ld returned 1 exit status make: *** [sapi/cgi/php-cgi] Err

    /usr/bin/ld: cannot find -lltdl collect2: ld returned 1 exit status make: *** [sapi/cgi/php-cgi] Err ...

  10. c++ 11 thread 初试

    最新的 c++11标准整合进了 线程支持.以下写一个小程序測试一下. 測试代码: #include <iostream> #include <thread> void hell ...