由于最近工作需求的原因,有一个功能就是将webView里面的照片保存到本地,并且能够直接在相册中有一个及时的反馈。

  项目中,具体是实现流程是这样的设计webview点击交互事件,当点击webview中的图片的时候抓取到图片的url地址;当需要保存图片的时候,通过nohttp下载图片并将图片保存到本地,然后更新相册。

  在这里,抓取url地址和下载图片的方案有很多,这里就不在赘述,这里是说明一下如何更新相册,因为这里是一个坑,我一共遇到过两个方案:

方案一:

 发送广播通知系统更新相册。

在网上大部分时候是这样做的,为什么呢?因为简单,只需要发送一个广播就OK了。但是这个方法是一个坑,坑在哪里,一会在说,这里先说一个怎么实现:

Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
Uri.fromFile(new File(url.webviewImagePath+"/image.jpg")));
File file= (File) object;
Uri uri = Uri.fromFile(file);
intent.setData(uri);
ShowImageActivity.this.sendBroadcast(intent);

  上面代码就是发送广播中的方式,其中url.webviewImagePath+"/image.jpg"是保存到本地的地址和图片格式,file是把下载到图片的对象object转换为file。之后发送广播通知系统更新相册就好。

  那么现在问题来了,坑在哪里。主要是下面两个问题:

  1、相册更新很慢

  这是因为我们向系统发送广播通知,却不能告知系统刷新特定的文件,所以系统会刷新整个sd卡。这样一来,自然相册更新会很慢。

  2、部分安卓版本相册无法更新,重启手机后会更新

  这是因为在部分安卓版本中,考虑到系统安全的问题,是不允许app向系统发送广播,这样一来自然无法更新相册,而另一个方面,手机重新启动,会重新挂载sd卡,这样就会刷新sd开所有东西。

  那么问题来了,既然通过广播的方式刷新相册有这么多坑,那么有没有什么好的方式呢?这就是第二种方式:

方案二:

  使用MediaScanner

  什么是MediaScanner?MediaScanner完成Android中的多媒体文件的扫描工作。例如,mediascanner扫描系统内存和SD卡文件之后,会将扫描的结果加载在数据库中,在Music这个应用程序中看到的显示在activity 的list列表上歌曲专辑名,流派,歌曲时长等信息,都是扫描后的结果放在数据库中,最后读到的数据库中的信息。这里可以明白的一点是:多媒体数据库中的信息是由MediaScanner添加的。下面就是使用的方式:

class SannerClient implements
MediaScannerConnection.MediaScannerConnectionClient { public void onMediaScannerConnected() { if (mFile == null) {
return;
}
scan(mFile, mMimeType);
} public void onScanCompleted(String path, Uri uri) {
mConn.disconnect();
} private void scan(File file, String type) {
if (file.isFile()) {
mConn.scanFile(file.getAbsolutePath(), null);
return;
}
//该方法可以遍历多个文件,这里不需要
File[] files = file.listFiles();
if (files == null) {
return;
}
for (File f : file.listFiles()) {
scan(f, type);
}
}
} public void scanFile(File file, String mimeType) {
mFile = file;
mMimeType = mimeType;
mConn.connect();
}

  在我们需要添加照片到相册的地方,这几调用scanFile就可以了,其中两个参数:file是指添加的文件,mimeType是扫描文件的格式。这样我们可以直接扫描添加特定的文件。提高了速度


不是闷骚的程序员算不上程序员。我的微信公众号“那点鼻事”,在这里周一到周五每天一篇文章,与技术无关,只哈牛逼。

android保存照片到相册的一些事的更多相关文章

  1. Android保存图像到相册

    在应用的图集中,通常会给用户提供保存图片的功能,让用户可以将自己喜欢的图片保存到系统相册中. 这个功能其实很好做,系统提供了现成的API: 简单的来说就这一行代码: [java]  MediaStor ...

  2. iOS开发之保存照片到系统相册(Photo Album)

    iOS开发之保存照片到系统相册(Photo Album) 保存照片到系统相册这个功能很多社交类的APP都有的,今天我们简单讲解一下,如何将图片保存到系统相册(Photo Album). 创建UIIma ...

  3. React Native之图片保存到本地相册(ios android)

    React Native之图片保存到本地相册(ios android) 一,需求分析 1,react native保存网络图片到相册,iOS端可以用RN自带的CameraRoll完美解决,但是andr ...

  4. android将应用中图片保存到系统相册并显示

    我应用到的场景是程序中在视频通讯时截图,将截图保存到本地相册中 /*** @param bmp 获取的bitmap数据 * @param picName 自定义的图片名*/ public static ...

  5. Android调用系统相机拍照保存照片很小解决方案

    保存图片小的一般操作步骤: 1. 调用系统相机 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityFo ...

  6. iOS开发之保存照片到自己创建的相簿

    iOS开发之保存照片到自己创建的相簿 保存照片还可以用ALAssetsLibrary,ALAssetsLibrary提供了我们对iOS设备中的相片.视频的访问,是连接应用程序和相册之间访问的一个桥梁. ...

  7. android基础---->摄像头与相册的调用

    很多应用程序都可能会使用到调用摄像头拍照和从相册选取图片的功能,今天我们开始android中摄像头与相册调用的学习. 目录导航 调用摄像头拍照 从相册中选择照片 友情链接 调用摄像头拍照 大致流程:调 ...

  8. android 拍照和从相册选择组件

    android 拍照及从相册选择组件 单独封装到一个 activity 中便于更好的复用 拍照或从相册选择成功后使用 EventBus 发出广播回传图片路径,和调用者充分解耦合 根据传入参数支持裁剪和 ...

  9. Android零基础入门第2节:Android 系统架构和应用组件那些事

    原文:Android零基础入门第2节:Android 系统架构和应用组件那些事 继上一期浅谈了Android的前世今生,这一期一起来大致回顾一下Android 系统架构和应用组件. 一.Android ...

随机推荐

  1. UVa 270 & POJ 1118 - Lining Up

    题目大意:给一些点,找出一条直线使尽可能多的点在这条直线上,求这条直线上点的个数. 以每一个点为原点进行枚举,求其它点的斜率,斜率相同则说明在一条直线上.对斜率排序,找出斜率连续相等的最大长度. #i ...

  2. 一句话绑定父函数的作用域this

    //如何在返回的函数中绑定父函数的作用域this function bound () { return function () { console.log(this); }.bind(this); } ...

  3. iOS 之 WebView 简单使用

    1. 代理 UIWebViewDelegate 2. 创建 UIWebView myWebView=[[UIWebView alloc] initWithFrame:CGRectMake(, ,sel ...

  4. js模块化开发——前端模块化

    在JavaScript发展初期就是为了实现简单的页面交互逻辑,寥寥数语即可:如今CPU.浏览器性能得到了极大的提升,很多页面逻辑迁移到了客 户端(表单验证等),随着web2.0时代的到来,Ajax技术 ...

  5. JS 继承(类式 与 原型式)

    1. /* -- 类式继承 -- *///先声明一个超类 function Person(name) { this.name = name;}//给这个超类的原型对象上添加方法 getName Per ...

  6. ZOJ-2343-Robbers

    题目链接 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1398 题意: 输入t 有t个测试用例每个测试用例第一行输入三个数n, ...

  7. C++实现具有基本功能的智能指针

    C++中的智能指针实际上是代理模式与RAII的结合. 自定义unique_ptr,主要是release()和reset().代码如下. #include <iostream> using ...

  8. Qt入门之基础篇(1):Qt4及Qt5的下载与安装

    转载请注明出处:CN_Simo. 导语: Qt是一个跨平台的C++图形界面应用程序框架.它提供给开发者建立图形用户界面所需的功能,广泛用于开发GUI程序,也可用于开发非GUI程序.Qt很容易扩展,并且 ...

  9. Javascript之深入浅出prototype

    我们先来讲一个故事,一个大大的池塘,里面有很多鱼.这是属于我们大家的池塘所以里面的鱼我们都可以吃,但是我们也会从集市买一些鱼放在家里,那么放在家里的鱼肯定是属于我们私人的,外人是不会拥有的.那么在js ...

  10. We Chall-Encodings: URL -Writeup

    MarkdownPad Document html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,ab ...