Android截图截取弹框AlertDialog
1:效果如图
2:权限
- <uses-sdk
- android:minSdkVersion="21"
- android:targetSdkVersion="21" />
- <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
- <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
- tools:ignore="ProtectedPermissions" />
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
3:实现
- public class MainActivity extends AppCompatActivity {
- private static final String TAG = "TAGA";
- int x = 1;
- private static final int REQUEST_MEDIA_PROJECTION = 1;
- private MediaProjectionManager projectionManager;
- boolean screenCapture = false;
- Handler mHandler = new Handler() {
- @TargetApi(Build.VERSION_CODES.LOLLIPOP)
- @Override
- public void handleMessage(Message msg) {
- super.handleMessage(msg);
- takeScreenshot2();
- }
- };
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- Button btn = findViewById(R.id.btn);
- btn.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- x=1;
- showAlertDialog();
- mHandler.sendEmptyMessageDelayed(100,1000);
- }
- });
- }
- @TargetApi(Build.VERSION_CODES.LOLLIPOP)
- @RequiresApi(api = Build.VERSION_CODES.KITKAT)
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- if (requestCode == REQUEST_MEDIA_PROJECTION ) {
- try {
- final int mWidth = getWindowManager().getDefaultDisplay().getWidth();
- final int mHeight = getWindowManager().getDefaultDisplay().getHeight();
- final ImageReader mImageReader = ImageReader.newInstance(mWidth, mHeight, PixelFormat.RGBA_8888, 2);
- DisplayMetrics metrics = new DisplayMetrics();
- getWindowManager().getDefaultDisplay().getMetrics(metrics);
- int mScreenDensity = metrics.densityDpi;
- final MediaProjection mProjection = projectionManager.getMediaProjection(-1, data);
- final VirtualDisplay virtualDisplay = mProjection.createVirtualDisplay("screen-mirror",
- mWidth, mHeight, mScreenDensity, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
- mImageReader.getSurface(), null, null);
- mImageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {
- @Override
- public void onImageAvailable(ImageReader reader) {
- if (x != 1) {
- return;
- } else {
- try {
- /**
- * 去掉--->mProjection.stop(); 会出现不停的截图现象
- */
- x = 2;
- mProjection.stop();
- Image image = mImageReader.acquireLatestImage();
- final Image.Plane[] planes = image.getPlanes();
- final ByteBuffer buffer = planes[0].getBuffer();
- int offset = 0;
- int pixelStride = planes[0].getPixelStride();
- int rowStride = planes[0].getRowStride();
- int rowPadding = rowStride - pixelStride * mWidth;
- Bitmap bitmap = Bitmap.createBitmap(mWidth + rowPadding / pixelStride, mHeight, Bitmap.Config.ARGB_8888);
- bitmap.copyPixelsFromBuffer(buffer);
- image.close();
- // 保存路径
- String pathImage = Environment.getExternalStorageDirectory().getPath() + File.separator + "AA" + File.separator;
- String nameImage = pathImage+"截图示例.png";
- if (bitmap != null) {
- try {
- File fileImage = new File(nameImage);
- if (!fileImage.exists()) {
- fileImage.createNewFile();
- }
- FileOutputStream out = new FileOutputStream(fileImage);
- if (out != null) {
- bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
- out.flush();
- out.close();
- Toast.makeText(MainActivity.this, "图片保存成功!", Toast.LENGTH_SHORT).show();
- Intent media = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
- Uri contentUri = Uri.fromFile(fileImage);
- media.setData(contentUri);
- getApplicationContext().sendBroadcast(media);
- screenCapture = false;
- }
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- } else {
- Toast.makeText(MainActivity.this, "cannot get phone's screen", Toast.LENGTH_SHORT).show();
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- }, null);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- /**
- * 截图功能调用
- */
- @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
- public void takeScreenshot2() {
- try {
- projectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
- startActivityForResult(
- projectionManager.createScreenCaptureIntent(),
- REQUEST_MEDIA_PROJECTION);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- public void showAlertDialog() {
- AlertDialog.Builder localBuilder = new AlertDialog.Builder(this);
- localBuilder.setTitle("简单对话框");
- localBuilder.setIcon(R.mipmap.ic_launcher);
- localBuilder.setMessage("提示信息?");
- localBuilder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface paramAnonymousDialogInterface, int paramAnonymousInt) {
- /**
- * 确定操作
- * */
- }
- });
- localBuilder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface paramAnonymousDialogInterface, int paramAnonymousInt) {
- /**
- * 确定操作
- * */
- }
- });
- /***
- * 设置点击返回键不会消失
- * */
- localBuilder.setCancelable(false).create();
- localBuilder.show();
- }
- }
Android截图截取弹框AlertDialog的更多相关文章
- android之自定义弹框
step1 创建窗体 final AlertDialog dialog =new Builder(this).create(); step2 获取View View viewDialog =View. ...
- android 自定义弹出框AlertDialog ,很炫的哦
于是就小小的模仿了下自己写了这个这样的效果,主要代码如下:dlg = new AlertDialog.Builder(context).create();dlg.show();dlg.getWin ...
- android 三种弹出框之一PopupWindow
PopupWindow 在android的弹出框我目前了解到的是有三种:AlertDialog,PopupWindow,Activity伪弹框, AlertDialog太熟悉了,这里就不介绍了 就先看 ...
- android标题栏上面弹出提示框(二) PopupWindow实现,带动画效果
需求:上次用TextView写了一个从标题栏下面弹出的提示框.android标题栏下面弹出提示框(一) TextView实现,带动画效果, 总在找事情做的产品经理又提出了奇葩的需求.之前在通知栏显示 ...
- android标题栏下面弹出提示框(一) TextView实现,带动画效果
产品经理用的是ios手机,于是android就走上了模仿的道路.做这个东西也走了一些弯路,写一篇博客放在这里,以后自己也可用参考,也方便别人学习. 弯路: 1.刚开始本来用PopupWindow去实现 ...
- Android填坑系列:在小米系列等机型上放开定位权限后的定位请求弹框
背景: 近期因实际项目需要,在特定操作下触发定位请求,取到用户位置及附近位置. 问题: 经初步选型,最终决定接入百度定位,按照百度定位SDK Android文档,接入过程相对顺利.但随后发现,在小米系 ...
- 弹框在UC浏览器或者Android机器上会被顶上去
弹框在UC浏览器或者Android机器上会被顶上去 可以通过监听resize事件 this.height = $(document).height(); window.addEventListener ...
- 遇到的一个移动端从下往上过渡的弹框,在Android下过渡动画的优化问题。
优化之前: /* 分享弹框样式 */ .popUpDiv { width: 100vw; height: 100vh; transition: all 0.5s ease; position: fix ...
- 考拉Android统一弹框
作者:钱成杰 背景 在快速开发的背景下,经历了n个版本后的考拉Android App中已经存在了各种各样看似相同却各有差别的弹框样式.其中包括系统弹框和自定义弹框,并且在线上时常会出现IllegalA ...
随机推荐
- mysql中文乱码归纳总结
今天使用sqlalchemy往mysql数据库里插入数据的时候,发生了错误,因为字段包含中文,所以报错.在问题解决之后做一个总结. mysql中文乱码包括几个方面.mysql服务器层面.mysql ...
- MongoDB - 认识MongoDB及数据类型
目录 MongoDB - 认识MongoDB及数据类型 启动 MogoDB的数据 MogoDB的数据类型 1.Object ID : Documents自生成的_id 2.string : 字符串,必 ...
- 腾讯云,搭建LAMP服务
lamp (Web应用软件) 编辑 Linux+Apache+Mysql/MariaDB+Perl/PHP/Python一组常用来搭建动态网站或者服务器的开源软件,本身都是各自独立的程序,但是因为常被 ...
- Java基础学习总结(74)——Java常见笔试题及答案汇总
1. 下面哪些是合法的标识符?(ABE )--标识符 A. $persons B. TwoUsers C. *point D. this E. _endline 2. 下面程序运行的结果是( D )- ...
- 接水问题(2010年NOIP全国联赛普及组)
时间限制: 1 s 空间限制: 128000 KB 题目描述 Description 学校里有一个水房,水房里一共装有m 个龙头可供同学们打开水,每个龙头每秒钟的供水量相等,均为1. 现在有n ...
- hdu_2046_骨牌铺方格_201311251403
骨牌铺方格 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- 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% ...
- 向Java枚举类型中加入新方法
除了不能继承enum之外,可将其看做一个常规类.甚至能够有main方法. 注意:必须先定义enum实例.实例的最后有一个分号. 以下是一个样例:返回对实例自身的描写叙述,而非默认的toString返回 ...
- /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 ...
- c++ 11 thread 初试
最新的 c++11标准整合进了 线程支持.以下写一个小程序測试一下. 測试代码: #include <iostream> #include <thread> void hell ...