Android—内部存储与外部存储、保存图片到相册
内部存储:
当一个应用卸载之后,内部存储中的这些文件也被删除。在创建内部存储文件的时候将文件属性设置成可读,其他app能够访问自己应用的数据,前提是他知道你这个应用的包名,如果一个文件的属性是私有(private),那么即使知道包名其他应用也无法访问。 内部存储空间十分有限,另外,它也是系统本身和系统应用程序主要的数据存储所在地,一旦内部存储空间耗尽,手机也就无法使用了。所以对于内部存储空间,我们要尽量避免使用。Shared Preferences和SQLite数据库都是存储在内部存储空间上的。内部存储一般用Context来获取和操作。
内部存储的统一路径:/data/user/0/"包名(如:com.example.myapplication)"
获得内部存储路径的方式:
外部存储:
外部存储可能是手机外置的SD卡,不过现在大多数手机后盖都不可能让你轻易拆开的,因为外部存储厂商已经帮配置好了,128G、64G,大部分的容量都是外部存储。
外部存储我们可以在文件管理中,Android/data/包名中找到,而内部存储我们是看不到的。
获得外部存储路径的方式:
Android10分区存储:
在Android Q中引入了分区储存功能,在外部存储设备中为每个应用提供了一个“隔离存储沙盒”。其他应用无法直接访问应用的沙盒文件。由于文件是应用的私有文件,不再需要任何权限即可访问和保存自己的文件。此变更并有助于减少应用所需的权限数量,同时保证用户文件的隐私性。
访问自己APP目录下的文件:
- 私有目录:内部存储+外部存储:访问不需要权限。
- 共有目录:MediaStore,Android10以下访问需要权限,Android10后仅当访问其他应用的文件时需要权限。
文件存储在应用私有目录下,在卸载该应用后,系统会清除该应用的目录中的所有文件。有时我们要在卸载后保留这些文件,请将其保存到 MediaStore 中的某个目录下。
访问其他应用创建的文件
只有在满足以下两个条件时,您的应用才能访问其他应用创建的文件:
- 您的应用已获得 READ_EXTERNAL_STORAGE 权限。
- 这些文件位于以下其中一个明确定义的媒体集合中:
- 照片:存储在 MediaStore.Images 中。
- 视频:存储在 MediaStore.Video 中。
- 音乐文件:存储在 MediaStore.Audio 中。
- 任何其他文件(包括“downloads”目录下的文件),必须使用存储访问框架
将图片保存到外部存储:
public String compressImageByQuality(Context Context, Bitmap bitmap, String filename, int quality) {if (bitmap == null) {return "";}final File f = new File(getExternalFilesDir(Environment.DIRECTORY_PICTURES) + "/" + filename);try {FileOutputStream fos = new FileOutputStream(f);bitmap.compress(Bitmap.CompressFormat.JPEG, quality, fos);fos.flush();fos.close();} catch (Exception e) {e.printStackTrace();}return f.getAbsolutePath();}
读取公共目录文件:
ParcelFileDescriptor parcelFileDescriptor = context.getContentResolver().openFileDescriptor(uri, mode);mode:"r" ,"rw"等等FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();Bitmap bm = BitmapFactory.decodeFileDescriptor(fileDescriptor);
图片保存到媒体库
老版本的方法:
1、直接插入媒体库
MediaStore.Images.Media.insertImage(ContentResolver cr, String imagePath,String name, String description);
通过该方法,提供文件名,图片路径就可以将图片插入媒体库。
2、发送广播
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + filePath))); //Uri.fromFile(new File(filePath))
发送广播方法,让媒体库去扫描你的图片文件,效率差,有延迟。
3、扫描文件方法
MediaScannerConnection.scanFile(getBaseContext(), new String[]{filePath}, new String[]{"image/jpeg"}, new MediaScannerConnection.OnScanCompletedListener() {@Overridepublic void onScanCompleted(String path, Uri uri) {ToastUtil.shortToast(getBaseContext(),"保存成功");}});
同样让媒体库去扫描你的图片文件,比第二效率高效。
上面的三种方法,最近项目实践中,只有第一种生效了,第二、三种尝试了很多次,相册都没看到图片,也可能是我方法不对。但是第一种已经被弃用了。
/*** Insert an image and create a thumbnail for it.** @param cr The content resolver to use* @param imagePath The path to the image to insert* @param name The name of the image* @param description The description of the image* @return The URL to the newly created image* @deprecated inserting of images should be performed using* {@link MediaColumns#IS_PENDING}, which offers richer* control over lifecycle.*/@Deprecatedpublic static final String insertImage(ContentResolver cr, String imagePath,String name, String description) throws FileNotFoundException {final File file = new File(imagePath);final String mimeType = MediaFile.getMimeTypeForFile(imagePath);if (TextUtils.isEmpty(name)) name = "Image";final PendingParams params = new PendingParams(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, name, mimeType);final Context context = AppGlobals.getInitialApplication();final Uri pendingUri = createPending(context, params);try (PendingSession session = openPending(context, pendingUri)) {try (InputStream in = new FileInputStream(file);OutputStream out = session.openOutputStream()) {FileUtils.copy(in, out);}return session.publish().toString();} catch (Exception e) {Log.w(TAG, "Failed to insert image", e);context.getContentResolver().delete(pendingUri, null, null);return null;}}
新方法:
Android10后该方法不需要获得权限。
public static void putBitmapToMedia(Context context,String fileName,Bitmap bm) {ContentValues values = new ContentValues();values.put(MediaStore.Images.Media.DISPLAY_NAME, fileName);values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");Uri uri = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);try {OutputStream out = context.getContentResolver().openOutputStream(uri);bm.compress(Bitmap.CompressFormat.JPEG, 100, out);out.flush();out.close();ToastUtil.longToast(context, "图片保存成功!");} catch (IOException e) {ToastUtil.shortToast(context,"图片保存失败");e.printStackTrace();}}
Android—内部存储与外部存储、保存图片到相册相关推荐
- android 根目录缓存,Android系统中内部存储和外部存储(公有目录、私有目录、缓存目录)详解...
首先,明确一个概念,Android内部存储和外部存储并非所谓的手机自带内存是内部存储,SD卡是外部存储云云. Android对内部存储和外部存储不是在物理上区分的,而是在逻辑上区分的.git 1.概念 ...
- Android内部存储与外部存储解析
Android开发的过程中.经常会涉及到存储,之前一直没有一个整体的概念,这篇文章就是进行一个知识点的梳理. Android的存储有:内部存储.外部存储. 想要了解这两个概念,我们先将开发软件中的DD ...
- Android内存解析(二)— 详解内存,内部存储和外部存储
总述 觉得十分有必要搞清楚内存,内部存储和外部存储的区别,还有我们在开发中真正将数据存在了手机的哪儿. 先提一个问题:手机设置的应用管理中,每个App下都有清除数据和清除缓存,清除的分别是哪里的数据? ...
- android+默认存储,Android 数据存储之SP存储,内部存储,外部存储
Android 数据存储之SP存储,内部存储,外部存储 Android提供了多种数据存储的技术来永久的保存应用数据,以便于开发者能够根据自己的需求来选择合适的数据存储方案,主要有SharedPrefe ...
- 转:彻底搞懂Android文件存储---内部存储,外部存储以及各种存储路径解惑
转自:https://blog.csdn.net/u010937230/article/details/73303034 前言: 对于任何一个应用来说,无论是PC端应用还是Android应用,存储肯定 ...
- Android文件存储---内部存储,外部存储以及各种存储路径解惑
本文转自:https://blog.csdn.net/u010937230/article/details/73303034 前言: 对于任何一个应用来说,无论是PC端应用还是Android应用,存储 ...
- Android开发中内存、内部存储、外部存储详解
手机是有两个内存的.2G和16G同时出现在一个手机中,2G是指运行内存,16G是指存储内存. 手机的内存,分两种,一个是存储内存,相当于电脑的硬盘,一般手机参数里超过4G的都是指这个.存储内存是可以扩 ...
- Android开发--文件系统中的内部存储和外部存储最全解析 附文件数据保存操作封装
文件存储 前言 文件存储 内存 内部存储 外部存储 内部存储操作 API 读写操作 外部存储操作 公共目录 私有目录 私有文件 私有缓存 文件各种操作封装 前言 众所周知,数据存储在每个应用中都会用到 ...
- 解析Android内部存储、外部存储的区别
1.背景 在开发过程中我们都会使用到手机的内部缓存.外部缓存.但有些开发者对这两个存储区域理解还够透彻,以为手机内置的存储卡(不可手机移除)就是内部存储, 可插拔的SD卡就是外部存储,其实这些理解都是 ...
最新文章
- 设计模式:结构型模式总结
- Golang的导包和引用包的问题
- 编译py-faster-rcnn的问题汇总及解决方法
- 【FFMPEG源码终极解析】void av_packet_unref(AVPacket *pkt)
- MySql中游标的定义与使用方式_数据库系列:MySql中游标的定义与使用方式
- 数据库MySQL/mariadb知识点——数据类型
- 没有qpress_MySQL 大数据备份方案之Percona XtraBackup
- 乐华娱乐前训练生黄智博卖口罩诈骗案宣判:获刑三年三个月
- python 函数式_10分钟学习函数式Python
- ACL 2021 | 丁香园知识增强预训练模型
- 协作,才能更好的中断线程
- c++ 多字节 转换为 unicode
- 唐纳德 高德纳给年轻人的建议 Donald Knuth - My advice to young people
- 机器学习防止模型过拟合的方法知识汇总
- mac mysql mysqldb_在 Mac 中安装 MySQLdb (Python mysql )
- 逍遥模拟器获取服务器信息出错,逍遥模拟器不能连上网怎么办?两招解决问题...
- typescript使用可选属性报错可能未定义
- delphi RichEdit控件中插入GIF动画表情
- 高中信息技术:信息技术教学论
- IP协议相关技术终极详解