内部存储:

当一个应用卸载之后,内部存储中的这些文件也被删除。在创建内部存储文件的时候将文件属性设置成可读,其他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 中的某个目录下。

访问其他应用创建的文件

只有在满足以下两个条件时,您的应用才能访问其他应用创建的文件:

  1. 您的应用已获得 READ_EXTERNAL_STORAGE 权限。
  2. 这些文件位于以下其中一个明确定义的媒体集合中:
    1. 照片:存储在 MediaStore.Images 中。
    2. 视频:存储在 MediaStore.Video 中。
    3. 音乐文件:存储在 MediaStore.Audio 中。
    4. 任何其他文件(包括“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—内部存储与外部存储、保存图片到相册相关推荐

  1. android 根目录缓存,Android系统中内部存储和外部存储(公有目录、私有目录、缓存目录)详解...

    首先,明确一个概念,Android内部存储和外部存储并非所谓的手机自带内存是内部存储,SD卡是外部存储云云. Android对内部存储和外部存储不是在物理上区分的,而是在逻辑上区分的.git 1.概念 ...

  2. Android内部存储与外部存储解析

    Android开发的过程中.经常会涉及到存储,之前一直没有一个整体的概念,这篇文章就是进行一个知识点的梳理. Android的存储有:内部存储.外部存储. 想要了解这两个概念,我们先将开发软件中的DD ...

  3. Android内存解析(二)— 详解内存,内部存储和外部存储

    总述 觉得十分有必要搞清楚内存,内部存储和外部存储的区别,还有我们在开发中真正将数据存在了手机的哪儿. 先提一个问题:手机设置的应用管理中,每个App下都有清除数据和清除缓存,清除的分别是哪里的数据? ...

  4. android+默认存储,Android 数据存储之SP存储,内部存储,外部存储

    Android 数据存储之SP存储,内部存储,外部存储 Android提供了多种数据存储的技术来永久的保存应用数据,以便于开发者能够根据自己的需求来选择合适的数据存储方案,主要有SharedPrefe ...

  5. 转:彻底搞懂Android文件存储---内部存储,外部存储以及各种存储路径解惑

    转自:https://blog.csdn.net/u010937230/article/details/73303034 前言: 对于任何一个应用来说,无论是PC端应用还是Android应用,存储肯定 ...

  6. Android文件存储---内部存储,外部存储以及各种存储路径解惑

    本文转自:https://blog.csdn.net/u010937230/article/details/73303034 前言: 对于任何一个应用来说,无论是PC端应用还是Android应用,存储 ...

  7. Android开发中内存、内部存储、外部存储详解

    手机是有两个内存的.2G和16G同时出现在一个手机中,2G是指运行内存,16G是指存储内存. 手机的内存,分两种,一个是存储内存,相当于电脑的硬盘,一般手机参数里超过4G的都是指这个.存储内存是可以扩 ...

  8. Android开发--文件系统中的内部存储和外部存储最全解析 附文件数据保存操作封装

    文件存储 前言 文件存储 内存 内部存储 外部存储 内部存储操作 API 读写操作 外部存储操作 公共目录 私有目录 私有文件 私有缓存 文件各种操作封装 前言 众所周知,数据存储在每个应用中都会用到 ...

  9. 解析Android内部存储、外部存储的区别

    1.背景 在开发过程中我们都会使用到手机的内部缓存.外部缓存.但有些开发者对这两个存储区域理解还够透彻,以为手机内置的存储卡(不可手机移除)就是内部存储, 可插拔的SD卡就是外部存储,其实这些理解都是 ...

最新文章

  1. 设计模式:结构型模式总结
  2. Golang的导包和引用包的问题
  3. 编译py-faster-rcnn的问题汇总及解决方法
  4. 【FFMPEG源码终极解析】void av_packet_unref(AVPacket *pkt)
  5. MySql中游标的定义与使用方式_数据库系列:MySql中游标的定义与使用方式
  6. 数据库MySQL/mariadb知识点——数据类型
  7. 没有qpress_MySQL 大数据备份方案之Percona XtraBackup
  8. 乐华娱乐前训练生黄智博卖口罩诈骗案宣判:获刑三年三个月
  9. python 函数式_10分钟学习函数式Python
  10. ACL 2021 | 丁香园知识增强预训练模型
  11. 协作,才能更好的中断线程
  12. c++ 多字节 转换为 unicode
  13. 唐纳德 高德纳给年轻人的建议 Donald Knuth - My advice to young people
  14. 机器学习防止模型过拟合的方法知识汇总
  15. mac mysql mysqldb_在 Mac 中安装 MySQLdb (Python mysql )
  16. 逍遥模拟器获取服务器信息出错,逍遥模拟器不能连上网怎么办?两招解决问题...
  17. typescript使用可选属性报错可能未定义
  18. delphi RichEdit控件中插入GIF动画表情
  19. 高中信息技术:信息技术教学论
  20. IP协议相关技术终极详解

热门文章

  1. 深入理解Activity启动模式之大结局
  2. PCB板设计阻抗匹配和零欧姆电阻作用解析
  3. python爬虫教你如何快速搜索信息
  4. OPENSTACK简介OpenStack介绍个人笔记
  5. 模糊测试入门案例,利用AFL和Honggfuzz模糊测试Tiff
  6. java使用MD5进行不可逆加密
  7. 谈谈MSG中的 WPARAM 和 LPARAM
  8. OpenCV编程-cvCvtColor函数
  9. Navicat连接Mysql时 1251 - client does not support ...的问题
  10. 中国锂电材料产业发展方向与运行前景调研报告2021年版