为什么 Android 4.4 KitKat 限制第三方应用的 SD 卡读写权限?

来源:互联网 发布:淘宝直通车没钱了 编辑:程序博客网 时间:2024/05/21 18:35

最近在做安卓4.4的SD卡升级模块,发现以往的根据getExternalStoragePublicDirectory 获取不到外置SD卡路径,这样导致我是没法坚持是否有外置SD卡,外置SD卡是否有升级包了。后来我们根据MTK的宏SWAP开启之后,就可以把内置存储转换成primary sd卡。这个问题就解决了。但是这样就没有办法对内置SD卡进行读写了。这样又导致了内置T卡无法读取的状态,目前这个问题没有办法解决。

以下是一些解释:


Google 给出的理由有一定的道理——相信很多有洁癖的人都很讨厌第三方应用在 SD 卡或者内置存储下随意建立文件夹吧,有节操的应用应该只在以自己的包名区分的目录下存放需要的文件。

至于为什么只限制 SD 卡,不包括内置存储,我觉得是因为 SD 卡是可以插在别的地方的,目录结构是有可能暴露出来的,也有可能被修改。规范应用在 SD 卡的读写,可以使得这个 SD 卡上的目录和文件可以在其他设备上被电脑「理解」——「这个目录是在某一个 Android 设备上用到的,我不必理会它」,如果第三方应用随意在 SD 卡根目录创建命名不规范并且无规律的目录,这个 SD 卡在其他地方就会使电脑或者人迷惑——「这个目录是干什么的?是谁创建的?我可不可以删掉它?」。手机的内部存储空间不能拆卸,所以其目录结构不会轻易暴露给用户,也不会放在别的设备上,所以可以暂时不管。

以上只是我的猜测,我是希望能再严格一点,把内置存储也限制了吧。

【pansz的回答(29票)】:

这有可能真的只是一个限制。但是这个限制并不彻底,因为 primary external storage 仍然可写,而支持双 SD 的设备并不很多。我们大家更期待的是让 primary external storage 也同样受到这个限制,虽然这个修改将涉及到更多应用的不兼容。

所以这个问题并没有彻底解决,到对 primary external storage 也限制的那个时候,才真正的解决了这个问题。

就目前而言,第二 SD 卡仍然是可以读写的,只是要读写到指定的目录(具体应该在 /Android/data/)。这样的规定意味着应用程序只能对 SD 卡的指定目录进行读写,不能读写任意目录。相当于 Google 出手对 SD 卡目录结构进行了规范。之前 android 不限制目录,所以各种应用就随意的在 SD 卡上建一个目录。然后 SD 卡上的目录到处都是,用户对这种现象早就深恶痛绝了!如果 Google 对这件事情下狠手,只能说是大快人心

另外说一下,SD 卡上的指定目录是这样获取的:

1,程序相关的 内置存储目录,这个目录位于内置 flash,应用程序可以随意读写:

getFilesDir();2,程序相关的 SD 卡外部存储目录,这个目录位于 SD 卡,应用程序可以随意读写:

getExternalFilesDir(null);3,SD 卡公共目录,这些目录仍然可以访问,不受权限限制:

Environment.getExternalStoragePublicDirectory(x)其中 x 可以是 Environment.DIRECTORY_ALARMS 等预定义的常量。可以查找 Environment 的帮助。

如果大家要存储数据,可以用 1 或者 2 的方法,获取正确的目录,然后进行任意读写,这样不会把 SD 卡的目录写乱。

【蔡尔苟的回答(11票)】:

因为很多应用(尤其国内开发的)喜欢在/sdcard和/sdcard1下一口气拉好几坨翔,十分顽固,删掉它立马重拉

【范宏伟的回答(2票)】:

学习了,立马重构代码,将数据放到了/data/data/com..../下了

【Neavo的回答(2票)】:

上面很多朋友说到限制应用在SD卡下面新建目录的问题,实际上就算是限制了在主储存建立目录的权限,依然不算是一个好方法。

因为在sdcard/Android/data/[应用包名]/下的文件,在程序卸载的时候这会一并被删除,对于需要大容量持久化的应用比如视频或者电子书应用,这并不是作者和用户愿意看到的。

【YongKang的回答(1票)】:

打开你的sd卡根目录,发现一大堆文件夹而且很多都是空的或者里面只有一些配置文件几KB的,你就会懂google的做法了



0 0