借某次写需求谈Android文件存储

前言

某天,我导让我写一个"崩溃日志本地收集"的功能,可以方便测试和开发查看崩溃原因。然后故事就开始了。

Round 1

哥们一开始,用context.getFilesDir()获取存储目录,这个方法返回的文件夹路径是data/data/包名/files,也就是Android的内部存储空间。

然后哥们很顺利的啊,把这个功能做出来了。

第二天开站会,测试提出了致命疑问:我们测试要怎么看到报错信息呢?

众所周知啊,这个路径手机不root是无法查看的。所以我看向我导:"手机root一下不就行了"

我导:改!

Round 2

哥们吸取教训啊,咱不存在内部,咱存外面还不行吗。这次我用context.getExternalFilesDir()获取存储目录,也就是外部存储的应用私有目录,路径是storage/emulated/0/Android/data/包名/files。

改个路径的事情,瞬间写好了。

我们这个日志搜集,一个是搜集Native层的报错,一个是搜集Jvm层的报错。然后经过测试,发现Jvm层的报错信息有权限取出来,而Native层的报错信息却没权限取出来

我们当时就震惊了:啊?同一个目录下存东西居然会出现两套权限?

然后另外一个Android开发的前辈就想通过adb强行把这个报错信息拿出来,但是问题是没有root过没法用su命令啊,所以这件事又绕回去了。

然后我导就让我改到根目录下。

行,哥们改!

Round 3

既然内部存储不行,存到外部存储的私有目录也不行,就只能存在公共目录了。也就是我们使用手机文件管理应用看,Music和Movie的那一层。

获取存储路径用Environment.getExternalStorageDirectory(),得到的路径是storage/emulated/0。

改完后我又发现,Native层的权限正常了,Jvm的报错信息写不进去了。

报错信息是:

java.io.FileNotFoundException:...(Opration not permitted)

我心想:啊?这个目录难道没有写权限?那Natvie的报错信息怎么写进去的?

当时复制粘贴进百度,看到了一名CSDN老哥的回答:

其实我当时就对这个回答存疑的,因为明显我能mkdir,但是.txt文本信息却写不进去。

终于,我在Stack Overflow看到了正解:

没错,真相只有一个,是文件名有问题。我将.txt改成了.log就能成功存储了。

至此,终于可以下班。

总结

Android的文件存储和权限管理是真的*蛋。

实习的每一天做需求,都像在拍走进科学,哎。

顺便复习一下Android文件存储吧:Android文件存储

相关推荐
Tsuki_tl1 小时前
【面试高频】 HashMap, HashTable,ConcurrentHashMap 之间的区别
面试·hashmap·synchronized·哈希表·多线程并发·hashtable·分段锁
城管不管2 小时前
第八次面试2026.8.10
面试·职场和发展
JieE2122 小时前
单例模式:为什么大模型只加载一次就够了?
面试
windliang2 小时前
Claude Code 源码分析(八):Memory 如何被写入、整理与按需召回
前端·算法·面试
lingran__3 小时前
C++ 高阶数据结构:红黑树万字详解|完整原理推导 + 插入实现 + 完整性校验【STL 底层】
数据结构·c++·面试·红黑树·二叉搜索树·平衡二叉树·stl底层
ssshooter3 小时前
为什么明明只有一个 12px 的小元素,父容器却有 63px 高?
前端·javascript·面试
淡海水3 小时前
15-07-YooAsset面试篇-Unity性能优化与内存管理
java·unity·面试·性能优化·c#·游戏引擎
.柒宇.4 小时前
运维常见面试题_02_数据库
运维·数据库·sql·面试
kyriewen15 小时前
面试官问"这段逻辑为什么这样写"——我才发现,这半年我写的代码,我自己都解释不了
前端·javascript·面试
大龄秃头程序员18 小时前
深入梳理 UIView touch 事件全链路原理与实战
面试