您的位置:首页 > 移动开发 > Android开发

Android中的文件存储位置分析

2017-01-09 17:26 393 查看
应用开发过程中,避免不了需要使用到文件存储。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
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android 文件存储