Android - 文件存储

Android 11 存取文件或保存取出图片到目录 前言 今天遇到个问题,在安卓10以下保存图片到目录有效,在安卓11上就不行。 有问题的代码是这样的 String path = Environment.getExternalStorageDirectory()+"/DirName/"+"123.jpg"; 上面这句代码获取的是文件的根目录。 最终的解决办法是,把上述代码换成下面这个代码: //下面这段代码获取的目录是//storage/emulated/0/Android/data/com.microhabit/files/DirName/ 阅读详情
AI摘要

本文介绍Android中内置存储与外部存储的区别及使用方式,涵盖私有目录、公有目录的访问机制,并重点说明Android 10及以上版本通过MediaStore和Storage Access Framework实现的分区存储规范,帮助开发者合理管理应用文件。

官方页面

一、概念

  • 机身存储在概念上被分为了内置存储和外置存储,插存储卡或外接U盘硬盘都属于外置存储(这年头几乎都不支持插卡,就算外接这种场景属于用户主动转移文件,而不是APP要考虑往那里存)。
  • 含有包名的路径都可以使用Context中的方法,不含有包名的路径和APP无关可以通过Environment中的方法来访问。
路径谁还可以访问APP卸载后存储的数据文件权限申请
内置存储

私有目录

data/data/包名/

只有自己,除非root。一起删除(存储的文件会算入到该APP的存储占用中)不需要
外部存储

专有目录

storage/sdcard/Android/data/包名/

对于小米,HyperOS 系统自带文件管理器可以直接访问,MIUI 自带文件管理器会跳转到原生File软件访问。第三方APP无法访问。Android 4.4 以后不需要

公有目录

storage/sdcard0/名称/

第三方APP,适合存放共享的文件。不会删除(存储的文件不会算入该APP的存储占用中)需要

自定义目录

storage/sdcard0/

Android 9及以前的第三方APP

二、内置存储 Internal Storage

路径:data/data/包名/

存储的数据不会被其它APP访问到(除非Root),APP卸载会一并删除,空间有限适合存储小数据。files目录存放持久化数据、cahce存放缓存数据(空间不足会被系统清理)、shared_prefs存放SharedPreference键值对文件,databases存放SQlite数据库文件。

getDataDir( )根目录:/data/user/0/包名

getFilesDir( )

文件目录:data/data/包名/files

getCacheDir( )

缓存目录:data/data/包名/ceche
openFileOutput(String name,int mode)写入文件到内部存储files目录,模式有MODE_PRIVATE私有、MODE_APPEND追加(重复调用不覆盖而是接着已存在的文件后面写)。
openFileInput(String name)从内部存储读取文件
FileOutputStream fos = openFileOutput("文件.txt", MODE_PRIVATE);
String s = "今天天气不错";
fos.write(s.getBytes());
fos.close();
//写入
try {
    val output = openFileOutput("data", MODE_PRIVATE)
    val writer = BufferedWriter(OutputStreamWriter(output))
    //use会自动关闭流,不用手写finally去close。
    writer.use { it.write(inputText) }
} catch (e: IOException) { e.printStackTrace() }
//读取
try {
    val input = openFileInput("data")
    val reader = BufferedReader(InputStreamReader(input))
    //forEachLine会将读到的每行内容都回调到Lambda表达式中
    reader.use { reader.forEachLine { content.append(it) } }
} catch (e: IOException) { e.printStackTrace() }

三、外部存储 External Storage

存储的数据可以被其它APP访问到。

3.1 私有目录

路径:storage/emulated/Android/data/包名/

私有目录就是Android这个文件夹,这个文件夹打开之后里边有一个data文件夹,打开这个data文件夹,里边有许多包名组成的文件夹。这个目录中的文件会被计入到应用程序的占用空间当中,同时也会随着应用程序的卸载而被删除(这样有利于系统维护也避免用户的反感)。

getExternalFilesDir(String type)

填入 null 返回根目录:storage/emulated/0/Android/data/包名/files,或以下子目录:

Environment. DIRECTORY_MUSIC        //音乐(根目录拼接/Music)

Environment. DIRECTORY_PODCASTS        //播客

Environment. DIRECTORY_RINGTONES        //铃声

Environment. DIRECTORY_ALARMS        //闹钟

Environment. DIRECTORY_NOTIFICATIONS        //通知

Environment. DIRECTORY_PICTURES        //图片

Environment. DIRECTORY_MOVIES        //视频

Environment. DIRECTORY_DICM        //手机拍摄的照片或视频

Environment. DIRECTORY_DOCUMENTS        //文档

Environment. DIRECTORY_DOWNLOADS        //下载

Environment. DIRECTORY_SCREENSHOTS        //截屏

Environment. DIRECTORY_RECORDINGS        //录像

getExternalCacheDir( )缓存目录:storage/emulated/0/Android/data/包名/cache
getExternalMediaDir已废弃:storage/emulated/0/Android/media

3.2 公有目录

路径:storage/emulated/0/

由系统创建的公有目录有九大类:DCIM相机、Screenshots截图、Download下载、Pictures图片、Movies电影、Documents文档、Music音乐、Ringtones铃声、Alarms闹铃、Notifications通知音。存储的文件不会计入到应用程序的占用空间当中,APP删除后不会删除存储在这里的数据。

  • Android9(api28)及以前:对任何文件读写均可读写。需要权限 READ_EXTERNAL_STORAGE 或 WRITE_EXTERNAL_STORAGE。
  • Android10(api29)或更高:自己APP贡献的文件可自由读写,默认对别人APP贡献的文件只能读,实在要修改需要跳转页面让用户手动授权。

3.2.1 通过 Environment 访问(Android 9及以前)

Environment.getExternalStorageDirectory()根目录:storage/emulated/0

Environment.getExternalStoragePublicDirectory(DIRECTORY_DCIM)

Environment.getExternalStoragePublicDirectory(DIRECTORY_ALARMS)

相机目录:storage/sdcard0/DCIM

闹铃目录:storage/sdcard0/Alarms

if(Environment.getExternalStorageState.equals(Environment.MEDIA_MOUNTED)){	
    //判断SD卡是否存在
    File dir = Environment.getExternalStorageDirectory();	//获取SD卡目录
    long totalSpace = dir.getTotalSpace();		//获取SD卡总大小
    long usableSpace = dir.getUsableSpace();		//获取SD卡可用空间
    String totalSize = Formatter.formatFileSize(this,totalSpace);	//格式化可用大小,自动换算成合适的单位
    String usableSize = Formatter.formatFileSize(this,usableSpace);	//格式化可用大小,自动换算成合适的单位
}

3.2.2 通过 MediaStore 访问(Android 10 及以后)

详见:分区存储(MediaStore、SAF)

分区存储(Scoped Storage)的推出是针对 APP 访问外部存储的行为(乱建乱获取文件和文件夹)进行规范和限制,以减少混乱使得用户能更好的控制自己的文件。公有目录被分为两大类:媒体文件(图片、音频、视频)的访问使用 MediaStore,其它文件通过系统的文件选择器访问 Storage Access Framework(简称SAF)。

3.3 自定义目录

路径:storage/sdcard0/

通过 File 手动在外置存储的根目录下创建自定义文件夹,APP删除后不会删除存储在这里的数据。为了让用户更好地管理自己的文件并减少混乱,Android10 及以后不支持自建目录。

类名API说明
FilecreateNewFile()创建文件
mkdir()创建单级文件目录
mkdirs()创建多级文件目录
delete()删除文件或目录
FileInputStreamFileInputStream(File)创建文件输入流(File对象)
FileInput(fileName)创建文件输入流(文件名)
read()从创建文件输入流中读取指定字节内容
FileOutputStreamFileOutputStream(File)创建文件输出流(File对象)
FileOutputStream(fileName)创建文件输出流(文件名)
write()将指定内容写入创建文件输出流
Android 手机存储及路径 目录 Android手机存储分类 二,内部存储 三,外部存储 私有目录 公有目录 四,数据删除 五,权限相关 android手机存储分类 分为:内部存储和外部存储 如何区分内部存储和外部存储:可以从物理和逻辑区分 从物理的角度区分,内部存储就是手机自带存储空间,外部存储就是外部接入的存储空间例如SD卡 从逻辑意义上区分,data,system 目录就是手机的内部存储,而 mnt 或者 storage目录下的sdcard0指向的sdcard目... 阅读详情

相关推荐

Android存储路径

这是一个测试不同版本android存储路径的例子

[转载] Android 存储路径浅析

博客出处:https://www.jianshu.com/p/80e10b3dbba5 Android 文件系统 在 Android Studio 可以在 DDMS 的 File Exploer 窗口中查看文件系统,下图就是一个 Android 文件系统目录。 Android 文件系统 Android 存储分类 (/data 目录和 /sdcard 目录) An...

BreakingPoint 1083

嵌入式学习的书单推荐

以上是一些优秀的嵌入式学习书单推荐。选择适合自己的学习材料对于学习嵌入式系统非常重要。每一本书籍都有其独特的优势和特点,读者可以根据自己的学习目标和兴趣选择合适的书籍。同时,我们也要注意不断实践和探索,结合实际项目和项目经验,不断提升自己的嵌入式技术水平。希望本文的推荐能够帮助大家在嵌入式学习的道路上取得更好的成果。

新程序圆 1980

android原生开发文件存储位置,需要知道的基础知识

参考 https://www.jianshu.com/p/ad844547a43b 前言 在android应用开发中,你的文件可以保存在3个位置:内部存储、外部公共目录、外部私有目录 内部存储(/data/data) 特点 应用被卸载后,文件也会在应用删除的时候跟随这一起删掉 外部私有目录(/storage/emulated/0/Android/data) 特点 应用被卸载后,文件也会在应用删除的时候跟随这一起删掉 外部公共目录 特点 应用被卸载后,文件不会被删除 ...

未金涛的博客 2万+

Halcon Camera-calibration 相关算子(一)

Halcon Camera-calibration 相关算子介绍

qq_44744164的博客 1366

Transformer论文解读

Transformer有多牛逼不用多说,时隔7年我们再来看看论文原文,看看这篇深刻改变世界的文章都说了什么。当然逐字逐句解读已经意义不大,我们只列考点。

xian0710830114的专栏 4406

android开发文件存储,安卓开发之文件存储(一)

安卓开发时,最常见的就是,最普遍的操作就是对用户的账户密码的保存,然而将信息进行保存的方式有多种,刚接触信息的保存,介绍下其中一种(文件存储),但是这种却不是很严谨,下面代码也不是特别好,还有待改进。文件存储是Android中最基本的一种数据存储方式,他不对存储的内容进行任何的格式化处理。所有数据都是原封不动地保存到文件当中的,因而他比较适合用于存储一些简单的文本数据或二进制数据。如果你想使用文件...

weixin_32270483的博客 584

GB 47955—2026 L2组合驾驶辅助强制国标全解、合规方案与工程代码落地

GB 47955—2026 L2辅助驾驶国标合规工程代码# 运行环境:Python3.8+,适配车载仿真、台架测试、算法验证场景# 依赖安装:pip install numpy dataclasses tqdm struct time json# ===================== 国标强制时序参数(完全对标GB 47955—2026) =====================HAND_OFF_FIRST_WARN = 5.0 # 手部脱离5s触发一级预警。

lin_xiu的博客 308

android 微信文件存储,安卓微信文件存储位置

新版的微信能录制小视频,也能把小视频发送给自己或分享给好友或者是朋友圈,也能将其收藏,但是,如果想要分享给qq好友等等,在微信是不能直接发送到qq上的,这时候就要找到其存储位置一切就都好办了。打开微信先录制好小视频,可以是提前录好的,然后再打开手机主面板的“文档”(小编的语言换成英语了所以是documents)打开手机的根目录,找到“tencent”点击打开,再找到“MicroMsg”这个文件夹点...

weixin_30802399的博客 8723

【ChangeCLIP】Remote sensing change detection with multimodal vision-language representation learning

ChangeCLIP论文及代码使用详解。持续更新变化检测最新论文,欢迎订阅本专栏。

向上生长的程序媛的博客 1338

如何学习总线技术

如何学习总线技术 以形象生动的比喻来描绘了总线技术的基本思想,指出了总线的基本分类和总线传输的基本原理,以及在学习过程中应当掌握的最基本的知识,对初学者有起到抛砖引入的作用。 0引言   如果一座只能容一个人来往的独木桥,两端的人都想要过桥,为了不拥挤、阻塞,那我们就得采取有效的办法。比如规定某段时间哪端的人过桥,另一端的人就等着该他过桥的时间段的到来,同时也还可以规定人多时要按先来后到或年

ce123的技术博客 8529

安卓的文件存储

前两天为了参加腾讯的面试,耽搁这个博客几天没有更新,结果还没出来,希望我能好运。 接下来继续复习安卓的文件存储,也就是安卓的IO。 安卓的文件存储有三种方式,第一种方式是使用shredPreferences,在shredPreferences中,文件的保存形式是XML文件的形式,文件保存的位置是\data\data\<包名>\shred_Prefs,保存的方式是使用键值对的形式,也就是key-v

爱吃青菜的鱼 733

Android安卓——数据存储之文件存储

在安卓中对数据的存储有了SQLite数据库存储数据,在本次学习的是对文件的存储。利用SharedPerences将数据存储在文件中。 实战:本次学习准备的实战是总结性写了一下数据内部存储的读写、文件内部存储的读写、在SD卡中的读写。 一、 简单存储SharedPreferences1、简单存储简介 SharedPreferences是一种轻量级的数据保存方式。 通过SharedPrefer

Deniece_X的博客 1455

仿真学习系列(三十八):Sigrity仿真之单端S参数提取

S 参数(Scattering Parameters)是高速信号分析中最基础也最常用的指标,能够全面表征走线、过孔、连接器等互连结构的高频行为。在 Sigrity PowerSI 中,Model Extraction 是最常用的 S 参数提取方式,适用于高速差分线、单端线、过孔、参考平面等各种拓扑结构。 本节将通过示例讲解如何在 PowerSI 中完成一次完整的 S 参数提取流程,包括:对象选择、端口设置、频率范围配置以及结果查看。掌握此方法后,即可对任意高速网络执行阻抗、插损、回损、串扰分析,为进一步的

案例文章,高速信号 838

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

安卓开发工程师- 文件存储

【代码】安卓开发工程师- 文件存储。

qq_62784677的博客 1374

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

安卓文件存储

1、文件存储简介 Android中的数据存储方式有五种,分别是文件存储、sharedpreferences、sqlite数据库、contentprovider以及网络存储 文件存储是Android中最基本的一种数据存储方式,它与java中的文件存储类似,都是通过I/O流的形式把数据原封不动的存储到文档中 Android中的文件存储分为内部存储和外部存储 2、SharedPreferences的使用 SharedPreferences是Android平台上一个轻量级的存储类,用于存储一些 应用程序的配

weizhishude的博客 861

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

android 文件存储位置,安卓各文件存储路径汇总(Android file path)

写下来,省得以后不记得到处翻:Environment.getDataDirectory() = /dataEnvironment.getDownloadCacheDirectory() = /cacheEnvironment.getExternalStorageDirectory() = /mnt/sdcardEnvironment.getExternalStoragePublicDirector...

weixin_35719581的博客 2076

Android插件化(四)基础之文件存储

/媒体存储已经移除了//存储媒体没有挂载//正在检查存储媒体//存储媒体是空白或是不支持的文件系统no_file_system//存储媒体已经挂载,并且挂载点可读/写//存储媒体已经挂载,挂载点只读//存储媒体正在通过USB共享//在没有挂载前存储媒体已经被移除//存储媒体无法挂载,可能是文件系统损坏了//存储媒体正在移除//未知的存储状态下面图片大概地概括了上面的方法![[Android插件化(四)基础之文件存储-1.png]]

轻口味的专栏 1670

【安卓】文件存储

第二个参数是文件的操作模式,主要有MODE_PRIVATE和MODE_APPEND两种模式可选,默认是MODE_PRIVATE,表示当指定相同文件名的时候,所写入的内容将会覆盖原文件中的内容,而MODE_APPEND则表示如果该文件已存在,就往文件里面追加内容,不存在就创建新文件。文件存储是Android中最基本的数据存储方式,它不对存储的内容进行任何格式化处理,所有数据都是原封不动地保存到文件当中的,因而它比较适合存储一些简单的文本数据或二进制数据。此时运行程序,在输入框中输入信息之后退出。

君子慎独,不欺暗室。卑以自牧,含章可贞。 1465

Android studio-文件存储

1.Android中的数据存储方式有五种,分别是文件存储、SharedPreferences、SQLite数据库、ContentProvider以及网络存储。文件存储:文件存储是Android中最基本的一种数据存储方式,它与Java中的文件存储类似,都是通过I/O流的形式把数据原封不动的存储到文档中。–Android中的文件存储分为内部存储和外部存储。内部存储:指将应用程序中的数据以文件方式存储到...

huanhuan59的博客 1万+

46. 【Android教程】文件存储

Android 提供了很多种存储的数据的方式,比如“Shared Preferenced”、“文件”、“SQLite”、“远端”等等。其中最直接的就是文件存储,本节就来看看如果通过文件的方式持久化我们的数据。

这是一个web全栈开发的博客,取其精华去其糟粕,争取让大家一看就懂,一学就会,一用就成~ 2351

Android 文件存储

Android 9 及以下版本 存储分类 内部存储 外部存储 判断SD卡是否挂起 私有存储读写数据 公有存储读写数据 Android 10 Android 11 及以上版本 保持图片到相册 查询图片 查询所有图片 删除图片 修改图片 保存到Download目录下 Storage Access Framework 复制图片到本应用程序下并显示 授予管理所有文件的权限

xiangxiongfly 1332

安卓文件存储的实现

这里介绍安卓进行文件存储的方法 比如我们用QQ登录等软件时 哪怕第二次登录时账号密码是可以保存起来的  就是这个场景 最终实现图   1.首先写一下布局文件 一共五个控件 2个Textview 两个Button 一个EditText activity_main.xml新加代码如下 <TextView android:id="@+id/textView1" android:l

汪小祯 816

Android文件存储

Android文件存储 1.getFilesDir(), 2.getCacheDir(), 3.getExternalFilesDir(null), 4.getExternalCacheDir(), 5.Environment.getExternalStorageDirectory(), 6.Environment.getExternalStoragePublicDirectory(Environ...

qq_24580361的专栏 1万+

安卓文件存储的小小总结

安卓四大存储中的文件存储 四大存储方式,其实是五大,因为网络云存储也已经普及得挺快的。不过这里先谈谈文件存储,也看过很多的博文,和一些零星的观点。但是网上的资料真的是找shi爹了。所以还是自己写点总结。 因为手机的ROM一般都是固定的,所以我们应该珍惜它的容量。 Android本身来讲是一个Linux操作系统,所以它的内部存储空间,对于应用程序和用户来讲就是“/data/data"目录

Ataraxia的专栏 1475
上一篇: Android - 键值对存储 SharedPreference、DataStore、MMKV
下一篇: Kotlin - 异常
Jomurphys
博客等级 码龄9年 1768粉丝 261原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值