Android程序获取存储卡及内部存储应用专属目录路径方法问询
嘿,我来帮你搞定这个Android存储路径的问题!你之前的代码踩了API使用的坑,咱们一步步理清:
/Android/data/[你的包名]/类路径 你要的这个路径是Android为每个应用分配的外部存储私有目录,系统提供了专门的安全API来获取,完全不用自己手动拼接路径(手动拼接不仅容易出错,还可能因为Scoped Storage机制或权限问题创建失败)。
正确的做法是使用Context的getExternalFilesDir()方法,它会直接返回外部存储上的/Android/data/[你的应用包名]/files/目录。如果需要创建Log子目录,直接基于这个目录操作即可,修正后的代码如下:
// 注意:需要在有Context的环境下调用,比如Activity、Service里 File externalBaseDir = getExternalFilesDir(null); // 创建Log子目录 File logDir = new File(externalBaseDir, "Log"); boolean isDirReady = true; if (!logDir.exists()) { isDirReady = logDir.mkdirs(); } if (isDirReady) { // 目录已存在或创建成功,这里可以放心进行文件读写操作 } else { // 创建失败,可能是外部存储未挂载、存储空间不足等原因,需要做异常处理 }
为什么你之前的代码不行?因为Environment.getDataDirectory()获取的是内部存储的根目录(路径为/data),普通应用根本没有权限在这个目录下创建子目录,所以mkdirs()会返回false,而且这完全不是你要的外部存储卡路径。
另外提一句:从Android 10(API 29)开始,Scoped Storage机制下,访问这个外部私有目录不需要申请WRITE_EXTERNAL_STORAGE权限,系统会自动授权,非常省心。
内部存储的应用私有目录同样有专门的API获取,用Context的getFilesDir()方法,返回的路径是/data/data/[你的应用包名]/files/。这个目录是应用的专属私有空间,其他应用无法访问,当你卸载应用时,这个目录会被自动删除。创建Log子目录的代码类似:
// 同样需要在有Context的环境下调用 File internalBaseDir = getFilesDir(); File logDir = new File(internalBaseDir, "Log"); boolean isDirReady = true; if (!logDir.exists()) { isDirReady = logDir.mkdirs(); } if (isDirReady) { // 可以进行内部存储的文件操作了 }
如果需要存放临时缓存文件,还可以用getCacheDir()方法,它会返回/data/data/[你的包名]/cache/目录,系统在存储空间不足时可能会自动清理这里的文件。
内容的提问来源于stack exchange,提问作者vico

