Android之获取外部存储空间解释

本文链接:http://blog.csdn.net/qq_16628781/article/details/61195621


Android之存储知识



知识点:

1、获取内部/外部存储空间方法介绍;

2、存储中需要的注意事项;


当我们需要用到存储数据的时候,例如音频文件,视频文件或者是下载的apk等等,我们应该如何来选择存放的目录呢。是放在自己APP所能接触到而其他APP无法解除的内部文件夹?还是需要共享的外部文件夹里头?


Google为我们提供了getExternalStorageDirectory(),getExternalFilesDir(),getExternalCacheDir(),getExternalMediaDirs(),getExternalStoragePublicDirectory()等等的API给我们,我们又该如何选择使用呢?


最近重新看了getExternalStorageDirectory()这个方法。然后看了他的源码说明,又发现了不少好的东西,这里我针对我所看到的这个说明,做一个剪短而有用的说明,记录一下,让自己可以有一个更加明确的记忆。关于应该要将文件存储在哪里做一个小结。


public static File getExternalStorageDirectory() {
        throwIfUserRequired();
        return sCurrentUser.getExternalDirs()[0];
    }

这个方法:返回的是优先存储共享/外部文件的文件夹。共享文件就是其他app可以访问的数据,例如我们在网易云下载的音乐,一般都是放在sdcard里头的,我们自己的APP也可以去访问这些音频文件。如果返回的目录被其他计算机占用,或者被移除了,或者其他问题发生了,就有可能不能访问。你可以利用getExternalStorageState()方法来判断是否可用。

有以下状态:

MEDIA_UNKNOWN:未知状态
MEDIA_REMOVED:移除状态
MEDIA_UNMOUNTED:未装载状态
MEDIA_CHECKING:检查中
MEDIA_NOFS:为空或者是使用了不支持的文件系统
MEDIA_MOUNTED:装载了
MEDIA_MOUNTED_READ_ONLY:只读状态
MEDIA_SHARED:未装载,但是有USB分享
MEDIA_BAD_REMOVAL:直接移除了
MEDIA_UNMOUNTABLE:不可装载的,可能是因为存储盘坏了


回到正题:

不要被“外部”这个词混淆了。最好是想象成是媒体/共享文件夹,这是不用强制的权限的。一般来说,这个是sd卡,但是也有可能是来自内部存储空间被装载为文件系统。

在某些设备中,我们还有可能是多用户的,但是这也是每个用户都有自己相互隔绝的存储空间,每个用户只能访问自己的存储空间。

这里有一个警告:我们最好不要直接使用存储目录的根目录(即是我们应该在根目录下创建新的目录来存放我们的数据),因为这样可以避免我们把设备的根目录弄乱。想像一下,如果每个APP都将数据放在根目录下面,那么根目录因为文件多到不行而不好管理了。通常,设备的存储空间是有限的,而且用户不一定会去管理(删除)一些文件,因为他们不知道哪些是应该删掉的。

私有的文件我们可以存储在由getExternalFilesDir()返回回来的路径下,在这个文件路径下的文件,在APP卸载之后,也会被一并删除。而需要共享的文件我们应该放在由getExternalStoragePublicDirectory()返回的路径的文件夹下面。


从API19(android.os.Build.VERSION_CODES#KITKAT)开始,如果你的APP只需要内部存储空间,可以考虑使用getExternalFilesDir(String)/getExternalCacheDir()/getExternalMediaDirs()返回的路径,使用以上3个方法,是不需要申请读写权限的。

注意一点:由于不同的SDK版本返回的路径可能被修改,所以最好使用相对路径。



下面说下getExternalFilesDir(String type)方法

此方法优先返回共享/外部的存储空间绝对路径,用来保存APP的持久化数据,而且不需要权限。对APP来说是内部的,也不可以给设备用户看见。此文件夹也会被删除,当APP被卸载的时候。

但是和getFilesDir()主要有两点不同:

1、共享的空间不一定都是可用的。有可能用户弹出了sd卡,可以用getExternalStorageState()来检查是否可用。

2、共享空间里的数据不是绝对安全的。拥有写权限就可以在里头写入数据。

入参有以下几个:

Environment#DIRECTORY_MUSIC
Environment#DIRECTORY_PODCASTS
Environment#DIRECTORY_RINGTONES
Environment#DIRECTORY_ALARMS
Environment#DIRECTORY_NOTIFICATIONS
Environment#DIRECTORY_PICTURES
Environment#DIRECTORY_MOVIES

返回的是给定的类型的子目录的路径。


这些文件默认是不会自动的被媒体库扫描到的。你也可以利用MediaScannerConnection#scanFile(Context, String[], String[], android.media.MediaScannerConnection.OnScanCompletedListener)加入到媒体数据库中,然后就可以被扫描到了。


getExternalCacheDir()方法

此方法返回的是用来保存APP缓存数据的目录,私有对于其他APP不可见和用户媒体库。

和getCacheDir()类似


getExternalMediaDirs()方法

返回APP指定的目录的绝对路径,私有不可见。




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值