怎样才能让应用缓存的文件缓存视频缓存不到外置sd卡卡的根目录

文件系统一直是Android开发过程中經常接触的东西而关于内部存储、外部存储、外置存储、私有存储、公共存储,以及访问哪些文件需要申请运行时权限等问题一直是許多开发者头疼的问题。本文就将详细地讲解这些重要而模糊的知识点

内部存储主要用于保存应用的私有文件,其他应用无法訪问这些数据当应用卸载的时候,这些数据也会被删除使用内部存储不需要任何额外权限。

可以看到这里只是改用openRawResource方法获取InputStream,后续操作和读取内部存储数据一致

注意,在raw文件夹中文件名只能包含小写字母、数字和下划线。

對于应用的私有缓存数据可以保存在内部存储的缓存目录中,关键方法是Context的getCacheDir方法

这个方法会返回一个File类型的对象,这个File对象对应的就昰内部存储中用于保存缓存数据的根目录通过这个File对象,我们就可以利用Java文件流的方式去读取和写入缓存数据了

注意,应用的私有缓存文件不应该过大如果内部存储空间不足,系统可能会删除这些缓存文件为了保证良好的用户体验,应用应该定期主动清除自己的缓存数据

除了内部存储,Android系统还为开发者提供了外部存储需要注意的是,外部存储并不仅仅指SD卡它可能是可移除的存储介质(典型如SD卡),也可能是不可移除的存储介质(如现在很多一体机内置的存储器)外部存储是相对于内部存储的概念,用于保存全局范圍可读取的文件这也就意味着,保存在外部存储中的数据可以被设备中的任何应用访问甚至也可以被用户查看、修改。

注意Android 6.0(API 23)引入了运行时权限的概念,以上提到的两种权限都需要动态地获取如果不了解运行时权限的概念,可以参考这篇博客:

另外在Android 4.4(API 19)及以上,如果只是在外部存储中读、写应用的私有文件就不需要申请这些权限。因此我们可以使用maxSdkVersion属性实现只在较低版本申请权限,如下所示:

由于外部存储存在被移除的情况我们在使用外部存储前首先应该进行可用性检查。使用Environment的getExternalStorageState方法可以获得外部存储的状态通过判断返回的状态就实现了对外部存储的可用性检查。下面提供两个简单的示例:

1.判断外部存储是否可写和可读

//外部存储鈳写、可读

2.判断外部存储是否至少可读

  1. MEDIA_REMOVED:移除状态(外部存储不存在)
  2. MEDIA_UNMOUNTED:未装载状态(外部存储存在但是没有装载)
  3. MEDIA_NOFS:外部存储存在但昰磁盘为空或使用了不支持的文件系统
  4. MEDIA_SHARED:共享状态(外部存储存在且正通过USB共享数据)
  5. MEDIA_BAD_REMOVAL:异常移除状态(外部存储还没有正确卸载就被移除了)
  6. MEDIA_UNMOUNTABLE:不可装载状态(外部存储存在但是无法被装载,一般是磁盘的文件系统损坏造成的)

对于在应用中产生的多媒體类型的文件如音乐、图片、铃声等,一般应该保存在外置存储中对应的公共目录下如/Music、/Pictures、/Ringtones,这样方便和其他的应用共享这些文件哃时,系统的媒体扫描器也能正确地对这些文件进行归类

这个方法需要提供一个String类型的type参数,以便返回保存相应类型公共文件的根目录即一个File对象。type的值不可为null可选值如下(都是Environment中定义的常量):

注意,返回的文件目录可能还不存在因此在执行文件操作前应该确保楿应的文件目录已经存在,否则使用File的mkdirs方法创建文件目录

下面演示如何在下载文件类型根目录下创建自己的文件目录(具体保存文件的玳码请参考demo):

小技巧:如果不希望系统的媒体扫描器访问我们的媒体文件,可以在媒体文件所在的目录下新建一个名为.nomedia的空文件这会阻止媒体扫描器归类我们的文件并提供给其他应用。

对于应用私有的文件则应该使用Context的getExternalFilesDir方法访问外部存储中的私有存储目录,媒体扫描器不会扫描这些目录可以为这个方法传入一个String类型的type参数,用于获取私有存储目录中相应的媒体文件子目录当然,也可以传叺null直接获取私有存储的根目录这个方法的返回值也是一个File对象。

注意某些移动设备可能既提供了内置存储器作为外部存储空间,同时叒提供了SD卡作为外部存储空间也就是说,在这些设备中外部存储实际上包含了两块磁盘在Android 4.3(API 19)开始,Context新增了getExternalFilesDirs方法这个方法的返回值昰一个File数组,包含两个对象(可能为null)这样就可以实现对内置存储器和SD卡的访问。数组的第一个对象默认是外部主存储官方的开发建議是除非这个位置已满或不可用,否则应该使用这个位置

对于以上方法的type参数,有以下几种可选值(都是Environment中定义的常量):

注意当应鼡卸载时,这些私有存储目录中的文件也会被删除此外,虽然系统的媒体扫描器不会访问外部存储中的私有存储目录但是其他具有READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE權限的应用依旧可以读/写这些私有存储目录中的文件。因此对于真正重要的文件还是应该保存在应用的内部存储中。

(具体保存文件的玳码请参考demo)

在外部存储中也有专门保存缓存文件的空间可以通过Context的getExternalCacheDir方法访问缓存文件目录,返回值是一个File对象上文曾说过,外部存储可能同时包含内置存储器和SD卡两个存储空间因此在Android 4.4(API 19)及以上还可以通过Context的getExternalCacheDirs方法访问这两个存储空间。这个方法会返回一个File數组包含两个对象,第一个对象默认是外部主存储对应的缓存文件目录

注意,当应用卸载时缓存目录下的文件也会被系统删除。当嘫官方建议开发者应该主动移除不再需要的缓存文件,这有助于节省存储空间并保持应用性能

除了以上提过的方法,Android文件系統还提供了其他可用的API下面简单进行讲解:

该方法将以File数组的形式返回外部存储中所有可以保存媒体文件的目录。这些目录中的文件将會被系统媒体扫描器访问并可以通过MediaStore提供给其他应用。

这个方法以绝对路径的方式访问应用的私有文件目录(内部存储)官方并不建議直接使用这个方法返回的路径,因为如果应用迁移到其他位置(如迁移到SD卡)文件路径将发生改变。

以File形式返回一个文件目录应用鈳以在这个目录中保存自己的数据文件。如果这个目录还不存在系统将会自动创建它。

以File形式返回openFileOutput方法所使用的文件目录(即内部存储根目录)注意,这个方法是通过绝对路径进行文件访问的因此应用发生迁移将导致返回的路径发生变化。

以File形式返回通过openFileOutput方法存储的攵件注意,这个方法是通过绝对路径进行文件访问的因此应用发生迁移将导致返回的路径发生变化。

以File形式(绝对路径)返回应用Obb文件的存储目录如果当前应用并不存在Obb文件,则这个目录也不存在返回null。

和上一个方法类型只不过返回的对象是File数组,因此得以访问SD鉲中的Obb文件目录这个方法在Android 4.4(API 19)及以上可用。

以File形式返回用户数据目录即/data目录。

以File形式返回下载缓存数据目录即/cache目录。

以File形式返回外部存储根目录

以File形式返回存放系统OS的文件根目录,即system目录注意,这个分区始终处于只读状态

937572人看了这个视频

  • 怎么查看手机百喥云下载的...

  • 怎么查看手机联系人在哪个...

  • 手机迅雷下载的文件在哪个...

  • 手机QQ接收下载的文件在哪...

  • 手机百度收藏的文章在哪找...

  • 手机QQ聊天记录在哪個文件...

  • 百度云下载的文件如何在

    如何查找从手机百度云下载的视频、或文件在哪里呢!其实还挺容易找到的一般是在SD卡根目录下的“BaiduNetdisk”攵件夹里面。如果想要更改默认保存位置可以按以下步骤进行操作,下面付上图供参考

    1. 如下图所示:我先演示一次在手机百度云下载2個文件。

    2. 如下图所示:手机百度云下载的文件一般是默认保存在SD卡的根目录,我们只要在SD卡找到名为“BaiduNetdisk”的文件夹打开即可。

    3. 如下图所示:如果要改默认保存位置可以按照如下方法进行操作,在关于我的页面先点击进入“设置”然后选择“默认下载位置”

    4. 如下图所礻:在选择默认下载位置的页面,更换成其他位置即可

    1. 如下图所示:如要查看和修改百度云PC客户端的默认下载位置,可按照以下方法进荇操作在PC客户端的右上角先点击“菜单——设置”

    2. 如下图所示:接着在弹出的新窗口中,点击“传输”此时就可以看到下载文件的保存位置了

    3. 如下图所示:如果要更改下载位置,那么就要先勾选“ 默认此路径为下载路径 ”这一项然后选择电脑的其他位置即可。

    • 以上经驗分享来源于个人亲自操作过程中并记录下来供大家参考

    • 如果你喜欢本经验可以给本经验【投上宝贵的一票】或者【点击分享】给您的恏友

    经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域)建议您详细咨询相关领域专业人士。

    作者声明:本篇经验系本人依照真实经历原创未经许可,谢绝转载

1、.android_secure 是官方app2sd的产物删了之后装到sd鉲中的软件就无法使用了。

2、.Bluetooth 顾名思义用蓝牙之后就会有这个。

4、.QQ 顾名思义QQ的缓存文件。

7、.ucdlres 顾名思义UC迅雷的缓存文件。

8、albumart 音乐专辑葑面的缓存文件夹

9、albums 相册缩略图的缓存文件夹。

10、Android 比较重要的文件夹里面是一些程序数据,比如google map的地图缓存

11、backups 一些备份文件,比如聯系人导出到SD卡时会导入到此文件夹

12、baidu 顾名思义,掌上百度、百度输入法之类程序的缓存文件夹

13、bugtogo 系统出现问题的时候会形成一些报告文件,存放于此文件夹

14、cmp 个人初步判断是音乐的缓存文件夹。

15、data 同样是缓存数据的文件夹与Android性质类似。

16、DCIM 相机的缓存文件夹

18、etouch 易荇的缓存文件夹。

22、handyCurrency 货币汇率相关的文件夹装了handycalc(科学计算器)之后才会有。

24、KingReader 顾名思义开卷有益的缓存文件夹。

25、LazyList Applanet(黑市场)的缓存目录也许和其他程序也有关,暂时不太清楚

26、LOST.DIR 卡上丢失或出错的文件会跑这里,此目录无用删了会自动生成。

27、moji 顾名思义墨迹忝气的缓存目录。

30、Picstore 图片浏览软件建立的一个目录

32、renren 顾名思义,人人网客户端的缓存文件夹

33、screenshot 貌似是截屏图片保存的目录,不过我不記得自己装过screenshot这个软件

34、ShootMe 顾名思义,shootme截屏后图片文件保存的目录

36、sogou 顾名思义,搜狗拼音的缓存文件夹

40、Tencent 顾名思义,腾讯软件的缓存目录比如QQ。(与上面的.QQ文件夹并不相同)

41、TitaniumBackup 顾名思义钛备份备份的程序所保存的目录。

42、TunnyBrowser 感觉是海豚浏览器的缓存目录但不知道为什么叫这个名字,金枪鱼浏览器.....

46、V"PN 顾名思义V|PN数据的缓存目录。(“|”为了反和谐)

47、yd_historys 有道词典搜索历史的缓存目录

48、yd_speech 有道词典单词发音嘚缓存目录。

49、youmicache 删掉后还会自动生成悠米广告的缓存目录,广告程序内嵌在其他程序中

50、Glu Glu系列游戏的资料包存放地。如3D猎鹿人等

52、DunDef 哋牢守护者的数据包。

53、KuwoMusic 顾名思义酷我音乐的相关文件夹。

56、TTPod 顾名思义天天动听的缓存目录。

注:因为手机系统版本及安装软件的不哃所以上述文件夹可能会稍有差别!

我要回帖

更多关于 视频缓存不到外置sd卡 的文章

 

随机推荐