欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android 内部存储, 外部存储, 移动存储

程序员文章站 2022-03-16 21:29:17
内部存储器 介绍 "The Storage Situation: Internal Storage" 简单来说Android的SDK认为内部存储器是一个对于你的app来说特定的, 可以放文件的目录. 这个目录下的文件的app只能由你的app读和写, 其他的app将不能够访问这些文件. 当然root权 ......

内部存储器 介绍

the storage situation: internal storage

简单来说android的sdk认为内部存储器是一个对于你的app来说特定的, 可以放文件的目录. 这个目录下的文件的app只能由你的app读和写, 其他的app将不能够访问这些文件. 当然root权限例外.

context中给你的获取内部存储器位置的方法....(sometimes):

  • getcachedir()

  • getdir()

  • getdatabasepath()

  • getfilesdir()

  • openfileinput()

  • openfileoutput()

其他的文件存取操作都依赖于此.例如数据库操作.

你的app的内部存储一般在/data/data/your.application.package.name

在其他的情况下

如果你的程序员这样写:

file f = new file("/data/data/their.app.package.name/files/foo.txt");

这样写不仅需要打更多的字, 我们需要的目录还不一定在这里.

当然, 我们有更好的代码:

file f=new file(getfilesdir(), "foo.txt");

在android10中内部存储器的操作还没有发生改变.

google's understand of "external storage"

the storage situation: external storage

外部存储器 介绍

android sdk文档是这么对"外部存储"定义的:

every android-compatible device supports a shared “external storage” that you can use to save files. this can be a removable storage media (such as an sd card) or an internal (non-removable) storage. files saved to the external storage are world-readable and can be modified by the user when they enable usb mass storage to transfer files on a computer

官方文档因为历史原因把'the stuff that shows up when the user plugs their device into a computer using a usb cable'这个定义为"external storage"外部存储, 但是android4.4 又增加了可移动媒体(存储?), 这也下面那篇文章讲的东西.

这里提及的外部存储的路径都是由environment.getexternalstoragedirectory().所指定的.但是, 这个方法在api29(即android10)被弃用了.

在android早期的版本, 内部存储和外部存储是相互分割的分区, 但是在3.0之后, 内部存储和外部存储在相同的分区,只是在不同的目录里面, 然后硬件厂商也没有继续把内部存储和外部存储当作两个分离的部分.(应该就是说现在的手机都是买来直接就是64gb, 128gb的, 不在物理上把内部和外部隔离了).

  • for us as developers, the actual path under which this magical “external storage” was accessed varied over the years, from /sdcard, to locations under /storage, to eventually the current /mnt/shell/emulated/0.

所以说不能把目录之类的东西hardcode进去

永远不要硬编码路径

  • environment.getexternalstoragedirectory() 可以获取外部存储的目录just a big basket of random content

  • getexternalfilesdir()和getexternalcachedir() 获取的是app相对应的在外部存储的目录的两个文件夹.

  • environment.getexternalstoragepublicdirectory() 集中放置的那些图片, 电影的文件.

android规定的app的权限: android1.5的时候, 有一个write_external_storage的permission, 在打开程序的时候, 回想用户请求app打算修改外部存储的内容, 任何app可以直接读取外部存储.

在android4.4之后, 强制执行read_external_storage, 如果你没有权限你无法读取外部存储.getexternalfilesdir() and getexternalcachedir()这两个方法甚至无需权限就可以直接读写.

android10 外部存储也不给随便创建文件夹了, 目前android10可以临时用一种方式来进行以前版本的操作。详见 temporarily opt-out of scoped storage

google thinks "removable storage"

the storage situation: removable storage

  1. 在大多数的设备上external storage ≠ removable storage

  2. 在android sdk中没有提到移动存储.

引用的一大段就是说在android4.4之后才有sdcard的支持,应用只能对自己的部分进行读写操作, 且无需权限, 并且通过文件浏览器无需任何权限就可以对任何文件进行操作.

在此之前和sdcard建立连接是通过各种黑科技.. 硬件厂商一套, 开发者自己又一套..

4.4之后只能读, 而没有写的权限.

google管这个叫secondary external storage

小结

总而言之android4.4到android10都可以在外部存储应用程序自己新建一个文件夹,用于备份等必要操作,而不用担心在app卸载的时候被删除。而android10之后需要使用其他的方法进行适配。