android7.1 保存图片到系统图库
感谢stormzhang博客的思路:
Android中保存图片的方法可能有如下两种:
- 第一种是自己写方法,如下代码:
public static File saveImage(Bitmap bmp) {File appDir = new File(Environment.getExternalStorageDirectory(), "Boohee");if (!appDir.exists()) {appDir.mkdir();}String fileName = System.currentTimeMillis() + ".jpg";File file = new File(appDir, fileName);try {FileOutputStream fos = new FileOutputStream(file);bmp.compress(CompressFormat.JPEG, 100, fos);fos.flush();fos.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}
}
以上代码便是将Bitmap保存图片到指定的路径/sdcard/Boohee/下,
文件名以当前系统时间命名,但是这种方法保存的图片没有加入到系统图库中
- 第二种是调用系统提供的插入图库的方法:
MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, "title", "description");
调用以上系统自带的方法会把bitmap对象保存到系统图库中,但是这种方法无法指定保存的路径和名称,上述方法的title、description参数只是插入数据库中的字段,真实的图片名称系统会自动分配。看似上述第二种方法就是我们要用到的方法,
但是可惜的调用上述第二种插入图库的方法图片并没有立刻显示在图库中,
而我们需要立刻更新系统图库以便让用户可以立刻查看到这张图片。
- 更新系统图库的方法
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
上面那条广播是扫描整个sd卡的广播,如果你sd卡里面东西很多会扫描很久,在扫描当中我们是不能访问sd卡,
所以这样子用户体现很不好,所以下面我们还有如下的方法:
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File("/sdcard/Boohee/image.jpg"))););
或者还有如下方法:
final MediaScannerConnection msc = new MediaScannerConnection(mContext, new MediaScannerConnectionClient() { public void onMediaScannerConnected() { msc.scanFile("/sdcard/Boohee/image.jpg", "image/jpeg"); } public void onScanCompleted(String path, Uri uri) { Log.v(TAG, "scan completed"); msc.disconnect(); }
});
上面代码的图片路径不管是通过自己写方法还是系统插入图库的方法都可以很容易的获取到。
终极完美解决方案
那么到这里可能有人又会问了,如果我想把图片保存到指定的文件夹,同时又需要图片出现在图库里呢?答案是可以的,sdk还提供了这样一个方法:
MediaStore.Images.Media.insertImage(getContentResolver(), "image path", "title", "description");
上述方法的第二个参数是image path,这样的话就有思路了,首先自己写方法把图片指定到指定的文件夹,
然后调用上述方法把刚保存的图片路径传入进去,最后通知图库更新。
所以写了一个方法,完整的代码如下:
public static void saveImageToGallery(Context context, Bitmap bmp) {// 首先保存图片File appDir = new File(Environment.getExternalStorageDirectory(), "Boohee");if (!appDir.exists()) {appDir.mkdir();}String fileName = System.currentTimeMillis() + ".jpg";File file = new File(appDir, fileName);try {FileOutputStream fos = new FileOutputStream(file);bmp.compress(CompressFormat.JPEG, 100, fos);fos.flush();fos.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}// 其次把文件插入到系统图库try {MediaStore.Images.Media.insertImage(context.getContentResolver(),file.getAbsolutePath(), fileName, null);} catch (FileNotFoundException e) {e.printStackTrace();}// 最后通知图库更新context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + path)));
}
有同学反映调用广播通知图库更新,但是不起作用,原因是 path 路径在代码中硬编码为 ‘/sdcard/xxxx’,这里需要使用 Eviroment.getExternalStorageDirectory 来获取 sd 卡路径,
这里是详细的分析过程:
http://droidyue.com/blog/2014/07/12/scan-media-files-in-android-chinese-edition/
原作者Demo内容:
1、ScannerUtils方法
package com.housheng.scanner.util;import java.io.File;
import java.io.FileOutputStream;import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.media.MediaScannerConnection;
import android.net.Uri;
import android.os.Environment;
import android.util.Log;
import android.widget.Toast;/****/
public class ScannerUtils {// 扫描的三种方式public static enum ScannerType {RECEIVER, MEDIA}// 首先保存图片public static void saveImageToGallery(Context context, Bitmap bitmap, ScannerType type) {File appDir = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), "哈哈哈");if (!appDir.exists()) {// 目录不存在 则创建appDir.mkdirs();}String fileName = System.currentTimeMillis() + ".jpg";File file = new File(appDir, fileName);try {FileOutputStream fos = new FileOutputStream(file);bitmap.compress(CompressFormat.JPEG, 100, fos); // 保存bitmap至本地fos.flush();fos.close();} catch (Exception e) {e.printStackTrace();} finally {if (type == ScannerType.RECEIVER) {ScannerByReceiver(context, file.getAbsolutePath());} else if (type == ScannerType.MEDIA) {ScannerByMedia(context, file.getAbsolutePath());}if (!bitmap.isRecycled()) {// bitmap.recycle(); 当存储大图片时,为避免出现OOM ,及时回收BitmapSystem.gc(); // 通知系统回收}Toast.makeText(context, "图片保存为" + file.getAbsolutePath(), Toast.LENGTH_SHORT).show();}}/** Receiver扫描更新图库图片 **/private static void ScannerByReceiver(Context context, String path) {context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,Uri.parse("file://" + path)));Log.v("TAG", "receiver scanner completed");}/** MediaScanner 扫描更新图库图片 **/private static void ScannerByMedia(Context context, String path) {MediaScannerConnection.scanFile(context, new String[] {path}, null, null);Log.v("TAG", "media scanner completed");}
}
2、mainActivity中:
package com.housheng.scanner;import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;import com.housheng.scanner.util.ScannerUtils;
import com.housheng.scanner.util.ScannerUtils.ScannerType;/*** @author HouSheng*/public class MainActivity extends Activity {private Bitmap bitmap = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ee);}public void onReceiver(View view) {ScannerUtils.saveImageToGallery(MainActivity.this, bitmap, ScannerType.RECEIVER);}public void onMedia(View view) {ScannerUtils.saveImageToGallery(MainActivity.this, bitmap, ScannerType.MEDIA);}}
感谢stormzhang的博客,
其中如下面写法,支持android7.1系统
MediaStore.Images.Media.insertImage(mContext.getContentResolver(),file.getAbsolutePath(), response.getName(), null);MediaScannerConnection.scanFile(mContext, new String[]{file.getAbsolutePath()}, null, null);
权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
android7.1 保存图片到系统图库相关推荐
- android 图库显示,【Android】 保存图片到系统图库, 并立即显示在图库中
搬运原链接:http://stormzhang.github.io/android/2014/07/24/android-save-image-to-gallery [正文] 最近有些用户反映保存图片 ...
- Android保存图片到系统图库
原文->http://stormzhang.github.io/android/2014/07/24/android-save-image-to-gallery/ 最近有些用户反映保存图片之后在 ...
- [Android Pro] Android保存图片到系统图库
http://stormzhang.github.io/android/2014/07/24/android-save-image-to-gallery/ http://blog.csdn.net/x ...
- Bitmap的getpixel(x,y)和保存到系统图库的方法
Bitmap.getpixel(x,y); 获得这个点坐标的int 值得color public void setPixel (int x, int y, int color) 把指定的颜色写入到位图 ...
- android 6.0获取图片地址,Android应用开发Android 保存图片到系统相册(三星6.0有效)...
Android 保存图片到系统相册(三星6.0有效).今天要做一个保存图片到系统图库的功能,自身能力较浅,所以只能搜索了但发现网上的方法有几处bug,所以自己总结一下防止以后忘掉也想和大家分享一下 ...
- Android 保存图片到系统相册(三星6.0有效)
今天要做一个保存图片到系统图库的功能,自身能力较浅,所以只能搜索了但发现网上的方法有几处bug,所以自己总结一下防止以后忘掉也想和大家分享一下. 首页网上保存图片并插入系统图库的方法: // 首先保存 ...
- android保存图片到系统相册及图库更新
public static void saveImageToGallery(Context context, Bitmap bmp) { // 首先保存图片 File appDir = ...
- okhttp下载保存图片并更新图库
实现效果图: 清单文件,下载和读写文件 <!-- 访问网络的权限 --><uses-permission android:name="android.permission. ...
- android 系统相册 多远,【系统相册】Android 保存图片到系统相册
保存完图片后,可以在内存设备的文件系统相册目录下看到对应图片(以小米手机为例,系统相册的路径为:/storage/emulated/0/DCIM/Camera).但是,使用系统图库无法马上看到该图片, ...
- 直播视频app源码,保存图片到系统相册
直播视频app源码,保存图片到系统相册相关的代码 public static void saveImageToGallery(Context context, Bitmap bmp) {// 首先保存 ...
最新文章
- webAPI过滤器添加参数签名
- 三相pmsm矢量控制仿真模型_学术|基于新型滑模观测器的永磁同步电机无传感器矢量控制系统...
- 从通用分页存储过程[ROWCOUNT方式]抽出适合自己需求的分页过程
- 栗子——自定义EditText实现右下角计数控件
- python安装计算机丢失api_Python安装后提示api-ms-win-crt-runtime-|1-1-0.dll丢失
- 转载:基于Redis实现分布式锁
- 20150109--面向对象+对象传值-01
- android 叠加视图 重启,android-后台应用程序以侦听拖动手势
- 记 第一次游戏测试实习经历
- oracle 转chr,[Oracle]Oracle之Chr函数返回
- centos7挂载ntfs文件系统_CentOS7挂载NTFS格式的硬盘
- Hello, World——从零到实盘0
- 京东获取商品历史价格信息 API接口
- 《2018秋招小结》
- 视频加密中的“一机一码”是什么意思?
- 达克效应:比绝望之谷更可怕的是迟迟未达到愚昧山峰
- WPS 合并一个工作簿中多个工作表
- 三极管吸潮失效分析案例
- Image Processing and Computer Vision_Review:Local Invariant Feature Detectors: A Survey——2007.11...
- python输出时间代码_Python获取世界多地时间怎么写代码呢?
热门文章
- EditPlus实现json格式化
- 海龟作图python等边三角形_python 海龟作图
- linux ubi 分区,Linux ubi子系统原理分析
- html 旋转木马 轮播,JS实现旋转木马轮播图
- python中转义符的用法_19.Python转义字符及用法
- cocos小小打飞机游戏项目源码资源共享学习
- 物联网应用隐私保护技术
- 计算机操作系统的最基本特性,操作系统有哪几大特征?其最基本的特征是什么?...
- 21天打卡活动 leetcode 301
- 《Adobe Photoshop CS5中文版经典教程(全彩版)》目录—导读