总结一下Android中用到的各种路径相关的API。
1. Environment中的方法
1. 返回数据目录
File file = Environment.getDataDirectory();
String path = file.getAbsolutePath();
path为:/data
2. 返回下载/缓存内容目录
File file = Environment.getDownloadCacheDirectory();
String path = file.getAbsolutePath();
path为:/data/cache
3. 返回主共享/外部存储目录。
File file= Environment.getExternalStorageDirectory();
String path = file.getAbsolutePath();
path为:/storage/emulated/0
注:1. 应用程序不应直接使用此顶级目录,以避免污染用户的根命名空间。
2.该路径需要读写的权限。
4. 获取顶级共享/外部存储目录以放置特定类型的文件
/**
* @params type: Environment.DIRECTORY_MUSIC,
* Environment.DIRECTORY_PODCASTS,
* Environment.DIRECTORY_RINGTONES,
* Environment.DIRECTORY_ALARMS,
* Environment.DIRECTORY_NOTIFICATIONS,
* Environment.DIRECTORY_PICTURES,
* Environment.DIRECTORY_MOVIES,
* Environment.DIRECTORY_DOWNLOADS,
* Environment.DIRECTORY_DCIM,
* Environment.DIRECTORY_DOCUMENTS
*/
File file = Environment.getExternalStoragePublicDirectory(String type);
String path = file.getAbsolutePath();
path为:/storage/emulated/0/Music
注:1.该路径需要读写的权限。
5. 返回包含核心Android OS的“系统”分区的根目录,该目录是只读目录。
File rootDirectory = Environment.getRootDirectory();
String path = file.getAbsolutePath();
path为:/system
2. Context中的方法
1. 返回主共享/外部存储设备上目录的绝对路径,应用程序可以在其中放置其拥有的永久文件。这些文件是应用程序的内部文件,通常不会被用户视为媒体。
/**
* @params type: Environment.DIRECTORY_MUSIC,
* Environment.DIRECTORY_PODCASTS,
* Environment.DIRECTORY_RINGTONES,
* Environment.DIRECTORY_ALARMS,
* Environment.DIRECTORY_NOTIFICATIONS,
* Environment.DIRECTORY_PICTURES,
* Environment.DIRECTORY_MOVIES,
* Environment.DIRECTORY_DOWNLOADS,
* Environment.DIRECTORY_DCIM,
* Environment.DIRECTORY_DOCUMENTS
*/
File file = context.getExternalFilesDir(String type);
String path = file.getAbsolutePath();
path为:/storage/emulated/0/Android/data/包名/files/Music
注:1. 从Android 4.4 Kitkat开始,对于当前app,操纵该目录不需要读写权限(原文:Starting in Build.VERSION_CODES.KITKAT, no permissions are required to read or write to the returned path; it's always accessible to the calling app.)。
- 应用卸载后,系统会删除该目录,拥有读写权限的其他的应用可以读写该路径。
- 如果该函数的参数传入null,返回的path为:/storage/emulated/0/Android/data/包名/files。
-
getExternalFilesDirs
该方法当有多个外置SD卡挂载时,可以获取多张SD卡上面的相应路径。
2.返回主共享/外部存储设备上特定于应用程序的目录的绝对路径,应用程序可以在其中放置其拥有的缓存文件。这些文件是应用程序的内部文件,通常不会被用户视为媒体。
File file = context.getExternalCacheDir();
String path = file.getAbsolutePath();
path为:/storage/emulated/0/Android/data/包名/cache
注:1.应用卸载后,系统会删除该目录,拥有写读写权限的其他的应用可以删除该路径。
2.平台并不总是监视共享存储中的可用空间,因此可能不会自动删除这些文件。应用应始终管理此位置使用的最大空间。
3.目前,平台删除此处文件的唯一时间是在Build.VERSION_CODES.JELLY_BEAN_MR1或更高版本上运行,而Environment.isExternalStorageEmulated(File)返回true。
4.从kitkat开始,如果是自己的app,该路径不需要读写权限。
3.返回应用程序可以放置媒体文件的所有共享/外部存储设备上特定于应用程序的目录的绝对路径。
File[] file = context.getExternalMediaDirs();
String path = file.getAbsolutePath();
path为:/storage/emulated/0/Android/media/包名
注:1.应用卸载后,系统会删除该目录,拥有写读写权限的其他的应用可以删除该路径
2.如果是自己的app,该路径不需要读写权限
4.返回文件系统上目录的绝对路径,其中存储了属于此应用程序的所有私有文件。应用不应直接使用此路径,应该用getFilesDir(),getCacheDir(),getDir(String, int)或者其他的API代替。
File[] file = context.getDataDir();
String path = file.getAbsolutePath();
path为:/data/user/0/包名
注:1.该路径不需要读写权限
2.该方法在API 24添加
5.打开与此Context的应用程序包关联的私有文件以进行写入。如果文件尚不存在,则创建该文件。
try {
FileOutputStream fos = context.openFileOutput("myPath", Context.MODE_PRIVATE);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
try {
FileInputStream fis = context.openFileInput("myPath");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
path为:/data/user/0/包名/files/myPath
注:该路径不需要读写权限
6.返回存储使用openFileOutput(String,int)创建的文件的文件系统的绝对路径。
File file = context.getFileStreamPath("mypath");
String path = file.getAbsolutePath();
path为:/data/user/0/包名/files/mypath
注:该路径不需要读写权限
7.返回此上下文的主Android包的完整路径。 Android软件包是一个ZIP文件,其中包含应用程序的主要代码和资源。
String path = context.getPackageCodePath();
path为:/data/app/包名-1/base.apk
或 /data/app/包名-2/base.apk
8.返回文件系统上特定于应用程序的缓存目录的绝对路径。
File file = context.getCacheDir();
String path = file.getAbsolutePath();
path为:/data/user/0/包名/cache
注:1.系统将自动删除此目录中的文件,因为设备上的其他位置需要磁盘空间。
2.系统将始终首先删除旧文件,如File.lastModified()所报告。 如果需要,您可以使用StorageManager.setCacheBehaviorGroup(File,boolean)和StorageManager.setCacheBehaviorTombstone(File,boolean)更好地控制文件的删除方式。
3.缓存的大小应该在StorageManager.getCacheQuotaBytes(java.util.UUID)的配额下,否则可能会被优先删除,配额也会随着用户与该app交互的频率而改变
4.不需要读写权限
9.返回用于存储缓存代码的文件系统上特定于应用程序的缓存目录的绝对路径。
File file = context.getCodeCacheDir();
String path = file.getAbsolutePath();
path为:/data/user/0/包名/code_cache
注:1.在升级特定应用程序以及升级整个平台时,系统将删除存储在此位置的所有文件。
2.此位置最适合存储应用程序在运行时生成的编译或优化代码。
3.不需要读写权限
10.返回此上下文的主Android包的完整路径。 Android包是一个ZIP文件,其中包含应用程序的主要资源。
String path = context.getPackageResourcePath();
path为:/data/app/包名-1/base.apk
或 /data/app/包名-2/base.apk
11.如果需要,检索并创建应用程序可以放置其自定义数据文件的新目录。
File file = context.getDir("nameDir", Context.MODE_PRIVATE);
String path = file.getAbsolutePath();
path为:/data/user/0/包名/app_nameDir
注:该路径不需要读写权限
12.返回主应用程序的OBB文件(如果有)的主共享/外部存储目录。请注意,如果应用程序没有任何OBB文件,则此目录可能不存在。
File file = context.getObbDir();
String path = file.getAbsolutePath();
path为:/storage/emulated/0/Android/obb/包名
注:1.应用卸载后,该文件夹会被删除
2.从kitka开始,如果是自己的app,该路径不需要读写权限,但是从M开始,需要读取权限才能访问该目录,但是,从N开始,又不需要权限了,所以访问方式是:
File obb = new File(obb_filename);
boolean open_failed = false;
try {
BufferedReader br = new BufferedReader(new FileReader(obb));
open_failed = false;
ReadObbFile(br);
} catch (IOException e) {
open_failed = true;
}
if (open_failed) {
// request READ_EXTERNAL_STORAGE permission before reading OBB file
ReadObbFileWithPermission();
}
13.返回文件系统上目录的绝对路径,其中存储使用openFileOutput(String,int)创建的文件。
File files = context.getFilesDir();
String path = file.getAbsolutePath();
path为:/data/user/0/包名/files
注:不需要读写权限
14.返回通过openOrCreateDatabase()方法创建的数据库的位置
File file = context.getDatabasePath("dbName.db");
String path = file.getAbsolutePath();
path为:/data/user/0/包名/databases/dbName.db
注:不需要读写权限
参考链接:
https://developer.android.google.cn/reference/android/content/Context
https://developer.android.google.cn/reference/android/os/Environment
网友评论