2019独角兽企业重金招聘Python工程师标准>>>

参考博客:Android从相册中获取图片以及路径

一、截图方法

屏幕截图,屏幕截图只能截取到当前窗体的图形,并不能截取,网上找了一大堆代码,雷同度太多了,根本无法截取到状态栏,

竟然还是有人在避免截取状态栏,只是一种讽刺么?可笑至极。

1.1首先来看你一种截取屏幕

getWindow().getDecorView().setDrawingCacheEnabled(true);
Bitmap screenBitmap = getWindow().getDecorView().getDrawingCache();
img_display.setImageBitmap(screenBitmap);
getWindow().getDecorView().setDrawingCacheEnable(false);//这里必须设置false,否则截图只能调用一次

1.2下面的是每次都可以截取到(只能截取到可见屏幕部分,不可见部分无法截取)

View decorView = getWindow().getDecorView();
Bitmap screenBitmap = Bitmap.createBitmap(decorView.getWidth(), decorView.getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(screenBitmap);
decorView.draw(canvas);

1.3截取可见与不可见屏幕部分(除ListView和GridView,只能截取ScrollView和HorizontalScrollView),原因是ListView和GridView的适配机制是不断的remove和add

注意:这里截取的是View而不是屏幕

ScrollView和HorizontalScrollView必须只有一个子布局,也就是说,他的子布局的来作为容器,它来作为滚动控件

ScrollView sv = (ScrollView)findViewById(R.id.scrollbox);
LinearLayout panel= (LinearLayout)sv.findViewById(R.id.scrollbox_panel);
int sumHeight = 0;
for(int i=0;i<panel.getChildCount();i++)
{sumHeight += panel.getChildAt(i).getHeight();
}Bitmap bmp = Bitmap.createBitmap(panel.getWidth(),sumHeight,Config.ARGB_8888);
Canvas canvas = new Canvas(bmp);
decorView.draw(canvas);
//over 至于有人认为,截取到的有些部分是黑色,那是英文你截取到的控件背景很可能是透明的,价格白色试试。

当然View内部提供了为公开的View 截图方法,createSnapshot,我们使用时只需要反射就行

 Bitmap createSnapshot(Bitmap.Config quality, int backgroundColor, boolean skipChildren) {int width = mRight - mLeft;int height = mBottom - mTop;final AttachInfo attachInfo = mAttachInfo;final float scale = attachInfo != null ? attachInfo.mApplicationScale : 1.0f;width = (int) ((width * scale) + 0.5f);height = (int) ((height * scale) + 0.5f);Bitmap bitmap = Bitmap.createBitmap(width > 0 ? width : 1, height > 0 ? height : 1, quality);if (bitmap == null) {throw new OutOfMemoryError();}Resources resources = getResources();if (resources != null) {bitmap.setDensity(resources.getDisplayMetrics().densityDpi);}Canvas canvas;if (attachInfo != null) {canvas = attachInfo.mCanvas;if (canvas == null) {canvas = new Canvas();}canvas.setBitmap(bitmap);// Temporarily clobber the cached Canvas in case one of our children// is also using a drawing cache. Without this, the children would// steal the canvas by attaching their own bitmap to it and bad, bad// things would happen (invisible views, corrupted drawings, etc.)attachInfo.mCanvas = null;} else {// This case should hopefully never or seldom happencanvas = new Canvas(bitmap);}if ((backgroundColor & 0xff000000) != 0) {bitmap.eraseColor(backgroundColor);}computeScroll();final int restoreCount = canvas.save();canvas.scale(scale, scale);canvas.translate(-mScrollX, -mScrollY);// Temporarily remove the dirty maskint flags = mPrivateFlags;mPrivateFlags &= ~DIRTY_MASK;// Fast path for layouts with no backgroundsif ((mPrivateFlags & SKIP_DRAW) == SKIP_DRAW) {dispatchDraw(canvas);} else {draw(canvas);}mPrivateFlags = flags;canvas.restoreToCount(restoreCount);canvas.setBitmap(null);if (attachInfo != null) {// Restore the cached Canvas for our siblingsattachInfo.mCanvas = canvas;}return bitmap;}

二、保存图片到相册

顺便提一下,MediaStore保存图片到相册,在手机中,相册和图片的联系是,相册中的图片一定是图片,但手机中的图片不一定是相册中的图片。

也就是说,相册并不保存图片,而是保存图片的路径,在手机中,并不是任何一张图片都能保存在相册中。

图片保存是使用ContentProvider提供的接口,下面是相册的Uri定位

Images.Media.EXTERNAL_CONTENT_URI

2.1最简单的保存方式

String uriString = MediaStore.Images.Media.insertImage(context.getContentResolver(), bmp, "截图-20141121", "这是我的截图");
//返回值是 Uri 协议字符串

2.2最完整的保存方式

ContentResolver contentResolver = context.getContentResolver();
ContentValues values = new ContentValues(4);
values.put(Images.Media.DATE_TAKEN, System.currentTimeMillis());
values.put(Images.Media.MIME_TYPE, "image/png");
values.put(Images.Media.ORIENTATION, 0);
values.put(Images.Media.TITLE, title);
values.put(Images.Media.DESCRIPTION, description);
Uri url = null;try {url = contentResolver.insert(Images.Media.EXTERNAL_CONTENT_URI, values); //其实质是返回 Image.Meida.DATA中图片路径path的转变而成的uriif (bmp != null){OutputStream imageOut = contentResolver.openOutputStream(url);try {bmp.compress(Bitmap.CompressFormat.PNG, 100, imageOut);} finally {imageOut.close();}long id = ContentUris.parseId(url);Images.Thumbnails.getThumbnail(contentResolver, id,Images.Thumbnails.MINI_KIND, null);//获取缩略图} else {Log.e("SAVE", "Failed to create thumbnail, removing original");contentResolver.delete(url, null, null);url = null;}}catch (Exception e) {Log.e("SAVE", "Failed to insert image", e);if (url != null) {contentResolver.delete(url, null, null);url = null;}}
 Images.Thumbnails.getThumbnail(contentResolver, id,Images.Thumbnails.MINI_KIND, null);//获取缩略图

2.3图片的保存的另一种方式(try catch太多,下面是简写方式,但代码绝对正确)

File file = new File("/mnt/sdcard/Pictures/"+imageDate+".png");
FileOutputStream  out = new FileOutputStream(file);
out.flush();
out.close();ContentResolver contentResolver = context.getContentResolver();
ContentValues values = new ContentValues(4);
values.put(Images.Media.DATE_TAKEN, System.currentTimeMillis());
values.put(Images.Media.MIME_TYPE, "image/png");
values.put(Images.Media.ORIENTATION, 0);
values.put(Images.Media.TITLE, title);
values.put(Images.Media.DESCRIPTION, description);
values.put(Images.Media.DATA, file.getAbsolutePath()); //保存图片路径
Uri url = contentResolver.insert(Images.Media.EXTERNAL_CONTENT_URI, values);

try doing it;

转载于:https://my.oschina.net/ososchina/blog/347366

Android 截图并保存到相册相关推荐

  1. 《从0到1上线微信小游戏》第十二节 实现截图和保存到相册功能

    第十二节 实现截图和保存到相册功能 新建节点 截图功能 保存到相册 在这一小节中,我们将通过调用微信小游戏API来给俄罗斯方块这个游戏加上截图和保存到相册这两个功能. 如果大家还需要实现截图后的预览功 ...

  2. 26.Android 下载图片保存到相册

    26.Android 下载图片保存到相册 Android 下载图片保存到相册 前言 实现思路 自定义Dialog 自定义Handler 自定义AsyncTask AndroidManifest配置权限 ...

  3. Android 下载网络图片保存到相册

    下载类,可以url下载到相册,记得在清单加权限,6.0代码动态加权限判断,下载图片要在子线程中下载,下载完后广播更新相册 在清单文件里面添加权限: <!--网络--><uses-pe ...

  4. android图片保存形式,Android应用开发之Android ScrollView截图和图片保存到相册的方式...

    本文将带你了解Android应用开发之Android ScrollView截图和图片保存到相册的方式,希望本文对大家学Android有所帮助. 1.1首先来看你一种截取屏幕,这种代码有缺陷,只能截取一 ...

  5. Unity功能记录(一) ------ 截图/录屏保存到相册(Android/iOS横屏竖屏都可以)

    截屏和录屏unity端代码都已经分享过 : Unity功能记录(十七) ------ 截屏功能 Unity插件(二) ------ NatCorder(录屏保存到相册) 但是之前一个个的其实并没有用在 ...

  6. [Android] 拍照、截图、保存并显示在ImageView控件中

    最近在做Android的项目,其中部分涉及到图像处理的内容.这里先讲述如何调用Camera应用程序进行拍照,并截图和保存显示在ImageView控件中以及遇到的困难和解决方法.     PS:作者购买 ...

  7. 【Flutter 问题系列第 22 篇】在 Flutter 中如何截取屏幕并显示到页面中,以及如何将截图保存到相册

    这是[Flutter 问题系列第 22 篇],如果觉得有用的话,欢迎关注专栏. 关于在 Flutter 中如何截取屏幕,以及如何将截图保存到相册的文章少之又少,即使有,也是错误一大片,有的甚至运行后都 ...

  8. Android 将PDF文件转Bitmap,并将Bitmap以图片的方式保存到相册

    转自:https://blog.csdn.net/chaogelilun/article/details/85095821 背景: 公司项目要求用户可以在手机端查看发票并将发票已图片的形式保存到相册, ...

  9. android将pdf文件转换成Bitmap,并将bitmap以图片的 方式保存到相册。

    背景: 公司项目要求用户可以在手机端查看发票并将发票已图片的形式保存到相册,以便打印,问题来了,因为发票是.pdf,android不支持直接查看pdf,所以要下载下来然后在手机上看,当时的需求是要下载 ...

最新文章

  1. python 字符串 转 dict
  2. 话筒增益_话筒啸叫怎么办?教你四个解决话筒啸叫的方法!
  3. adf.test_在ADF 12.2.1.3中使用基于JSON的REST Web服务
  4. vc++ windows 创建桌面快捷方式
  5. Mysql学习总结(20)——MySQL数据库优化的最佳实践
  6. android滑动fragment,android中ViewPager结合Fragment进行无限滑动
  7. 12、箱形图和小提琴图的绘制
  8. 字符串的编码格式转换
  9. word文字上下间距怎么调_word表格中怎么调整文字行间距以及字符间距
  10. od机考题目-机器人走迷宫
  11. 捕鱼达人(unity实现)
  12. 110配线架打法图解_「干货」图文并茂教会你110语音配线架线缆打法
  13. 手机app网易邮箱服务器设置,网易邮箱手机上设置Exchange服务教程
  14. 魅族手机安装Google Play
  15. SQL 常用基础语句
  16. VM虚拟机安装及应用
  17. 麦克风声源定位原理_基于麦克风阵列的声源定位算法之GCC-PHAT
  18. Linux命令打开电源设置,使用Linux控制USB电源(开/关)
  19. 记一次python,QQ机器人开发(入门)
  20. UBT5:ubuntu安装GIMP

热门文章

  1. vbs修改office设置_E002 Ruby 写入数据 【 =gt; Office 】
  2. 纯css实现网页侧边栏弹窗滑进滑出
  3. 刷magisk模块后不能开机_联想启天商用电脑刷BIOS或维修换主板后 开机叫两声处理办法...
  4. 基于VC++开发串口通信的方法
  5. rpc进程Linux,linux RPC 测试(转载)
  6. Python 网络爬虫笔记5 -- Beautiful Soup库实战
  7. python3的3D实战 -基于panda3d(3)
  8. 【算法】算法岗需要顶会才能入场?
  9. 漫画:程序员的社会地位
  10. 【Python】安利 3 个 pandas 数据探索分析神器!