Android中的文件存储位置分析

应用开发过程中,避免不了需要使用到文件存储。Android在不同的系统版本中,对存储空间的使用限制会有所不同。如在6.0以上版本,对于外置存储空间的使用,需要动态申请权限,而6.0以下则不需要。不同的存储路径同样也会有区别。如内置存储空间无需权限申请可直接使用,而外置存储空间则可能会需要相应的权限。

在存储文件或缓存数据时,我们需要尽量做到以下几点:
(1).不要随意占用用户的内置存储。
(2).不要随意在SD卡上新建目录,应该放置自己应用包名对应的扩展存储目录下,这样卸载App时可以被自动清除。
(3).对占用的磁盘空间有上限,并按照一定的策略进行清除。

文件存储的位置

一般情况下,在Android系统中,有以下3种目录提供给开发者用来存储文件。

1.应用程序私有存储空间
该存储空间在内置存储中,无需申请权限即可使用。
context.getFilesDir();
描述:获取内置存储下的文件目录,可以用来保存不能公开给其他应用的一些敏感数据如用户个人信息。
路径:在6.0以下版本中为/data/data/<package_name>/files/,6.0以上版本中为/data/user/0/<package_name>/files。

context.getCacheDir();
描述:获取内置存储下的缓存目录,可以用来保存一些缓存文件如图片,当内置存储的空间不足时将被系统自动清除。
路径:在6.0以下版本中为/data/data/<package_name>/cache/,6.0以上版本中为/data/user/0/<package_name>/cache。

在开发中,尽量不要占用该存储空间,当检测到手机未安装SDCard时再考虑使用。由于是在手机内置存储中,如果手机未获取root权限,那么文件浏览器是无法访问的。当应用程序被卸载时,这里的数据会一起被删除。

2.应用程序扩展存储空间
该存储空间在外置存储中,当API<19(android4.4)时,需要申请权限;当API>=19时,无需申请权限。
context.getExternalFilesDir(String type);
描述:获取SDCard上的文件目录。参数type可为空,此时获取的是根目录。
路径:<sdcard_path>/Android/data/<package_name>/files/

context.getExternalCacheDir();
描述:获取SDCard上的缓存目录。
路径:<sdcard_path>/Android/data/<package_name>/cache/

如图所示:


由于SDCard可以被所有的应用程序读取到,所以在这里不要存放用户敏感数据。如果仅仅是简单的缓存任务,如图片的缓存,我们可以选择使用该路径。这里的文件同样会随着应用程序的卸载而被删除。

3.公共存储空间
该存储空间在外置存储中,必须要申请权限才能使用。
Environment.getExternalStorageDirectory();
描述:获取SDCard根目录。
路径: <sdcard_path>/

有时候我们需要存储一些公共文件,并且希望这些文件在应用程序被删除后依旧存在,如用户下载的视频、音乐等,可以使用该目录。


上述3种存储目录中,应用程序的私有存储空间和扩展存储空间(即1和2),可以由用户手动清除。在系统设置中,找到应用程序的存储管理,可以看到如下界面:


清除缓存:删除缓存数据,即getCacheDir()与getExternalCacheDir()。
清除数据:删除所有数据,即getFilesDir()、getCacheDir()、getExternalFilesDir(null)、getExternalCacheDir()。


存储权限的申请

在Android6.0之前的系统版本中,只要在清单文件中申请了下面两个权限,就可以在SDCard上进行文件的读写操作了。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

而在6.0之后的版本中,由于动态权限的引入,需要在使用时动态去申请。
private static final int REQUESTCODE_STORAGE = 1;

public void checkPermission() {
    int permission = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
    if (permission != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUESTCODE_STORAGE);
    } else {
        // your code
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    if (requestCode == REQUESTCODE_STORAGE) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // your code
        }
    }
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值