android保存照片到相册的一些事

  由于最近工作需求的原因,有一个功能就是将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是扫描文件的格式。这样我们可以直接扫描添加特定的文件。提高了速度

时间: 2024-10-12 14:52:50

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

Android开发之从相册选择照片

Android开发之从相册选择照片 请尊重他人的劳动成果,转载请注明出处:Android开发之从相册选择照片 我曾在 <Android开发之裁剪照片>一文中介绍过,如何从相册选取照片和拍摄照片并进行裁切,在本篇中主要向介绍从相册选择原生照片(不裁切). 第一步:向系统发送选择照片的意图. /** * 从相册选择原生的照片(不裁切) */ private void selectFromGallery() { // TODO Auto-generatedmethod stub Intentinte

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

iOS开发之保存照片到系统相册(Photo Album) 保存照片到系统相册这个功能很多社交类的APP都有的,今天我们简单讲解一下,如何将图片保存到系统相册(Photo Album). 创建UIImageView 创建UIImageView是为了将照片展示出来,我们是要把UIImage保存到系统相册(Photo Album): #define SCREEN [UIScreen mainScreen].bounds.size self.image = [UIImage imageNamed:@"i

iOS开发&gt;学无止境 - 保存照片到系统相册(Photo Album)

保存照片到系统相册这个功能很多社交类的APP都有的,今天我们简单讲解一下,如何将图片保存到系统相册(Photo Album). 创建UIImageView 创建UIImageView是为了将照片展示出来,我们是要把UIImage保存到系统相册(Photo Album): #define SCREEN [UIScreen mainScreen].bounds.size self.image = [UIImage imageNamed:@"iOSDevTip"]; UIImageView

保存照片和视频到相册显示

照片和视频保存到本地的方法大致都是通过流的方式写入文件里面就可以达到保存到文件夹的目的,但是你保存到文件夹的资源却不一定能够在相册显示出来,只能翻看文件管理. 怎么能够将保存到本地的照片视频显示在系统相册中,最常用的方式是发送广播扫描的方式来通知系统扫描文件夹,但是这种方式经常不起作用,根本原因在于,向系统发送广播时系统只会去扫描系统资源的相册,如果你保存的文件夹是自己建立的,那么你发广播时系统是不会扫描到的. 解决这个问题,想要显示在相册需要将数据插入到ContentProvider中,因此对

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

保存图片小的一般操作步骤: 1. 调用系统相机 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, 1); 2. 保存照片 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {  // TODO Auto-generated method s

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

我应用到的场景是程序中在视频通讯时截图,将截图保存到本地相册中 /*** @param bmp 获取的bitmap数据 * @param picName 自定义的图片名*/ public static void saveBmp2Gallery(Bitmap bmp, String picName) { String fileName = null; //系统相册目录 String galleryPath= Environment.getExternalStorageDirectory() + F

Android保存图片到本地相册

好久没有写东西了.备份下知识吧.免得忘记了 . 首先贴一段代码 --  这个是先生成一个本地的路径,将图片保存到这个文件中,然后扫描下sd卡.让系统相册重新加载下 .缺点就是只能保存到DCIM的文 件夹下边,暂时不知道怎么获取系统相机的路径,网上找了下说了好几个方法.其中有一条就是去读取本地的图片,然后根据一定的规则识别出本地相册的路径 保存下,不过觉得性能不是很好.谁有更好的方法可以提供下. private class DownloadTask extends AsyncTask<String

Android学QQ空间相册浏览类型横向滑动效果显示多图片MyHorizontalScrollView

Android学QQ空间相册浏览类型横向滑动效果显示多图片MyHorizontalScrollView 我们来定制一下吧 布局文件:activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="m

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

iOS开发之保存照片到系统相册(Photo Album), 保存照片还可以用ALAssetsLibrary,ALAssetsLibrary提供了我们对iOS设备中的相片.视频的访问,是连接应用程序和相册之间访问的一个桥梁. 接下来,我们来详细讲解一下关于系统相册权限获取.保存照片.创建自己的相簿等等功能. 创建自己的相簿 这也是一种比较创建的作法,创建自己的相簿,然后把照片或者视频保存到自己的相簿中.相关代码如下: ALAssetsLibrary *library = [[ALAssetsLib