Android 文件存储

作者: 任教主来也 | 来源:发表于2017-02-28 12:30 被阅读1910次

    Android 存储位置及 API

    一、内部存储

    应用安装后都会在Android 根目录生成 /data/data/packagename,当前应用读取不需要读写权限

    注意: 有些开发者可能看到过应用的根目录为 /data/user/0/packagename 的情况,这里解释一下,Android 4.2 版本添加了同一设备可以登录不同用户的功能(由于专利原因仅限于平板电脑,手机不支持此功能),所以为了区分不同用户在同一应用中的设置和存储的数据,添加了该系列的路径,该路径指向 /data/data/packagename

    1. getFileDir() 方法得到的是该目录下 files 文件夹的 File 对象
    2. getChacheDir() 方法得到的是该目录下 cache 文件夹的 File 对象
    3. 直接调用ContextWrapper的 openFileOutput(String name,int mode) 也会在该目录下 files 文件夹下创建相应的文件,并且是私密的。可以修改为其他应用可访问的,通过 openFileOutput 方法的 mode 参数来完成

    注意:
    1. 该目录只有 root 权限下可以查看,会随着应用卸载删除
    2. 应用程序详情中清除数据会将 packagename 下所有数据以及内置存储、外置 SD 卡存储空间中 /Android/data/packagename 的整个目录删除删除
    3. 应用程序详情中清除缓存会将 packagename/cache 目录下所有数据以及内置存储、外置 SD 卡存储空间中 /Android/data/packagename/cache 的整个目录删除

    二 内置存储

    手机自带 ROM 的存储路径

    1. getExternalCacheDir() 方法,获取内置存储卡中 /Android/data/packagename/cache 目录的路径,4.4及之后读写不需要权限,会随着应用卸载删除
    2. getExternalFilesDir() 方法,获取内置存储卡中 /Android/data/packagename/files 目录的路径,4.4之后读写不需要权限,会随着应用卸载删除,该方法参数为 "null" 时不指定子文件夹,指定时创建子文件夹保存文件。创建的文件其他应用只要有读写权限也可以读取,如果要私密的就使用内部存储。
    1. Environment.getExternalStorageDirectory() 方法得到的是内置存储目录的根路径目录,读写需要权限,不会随着应用卸载删除
    2. Environment.getExternalStoragePublicDirectory() 方法得到的是内置存储目录根路径下的特定类型文件的公共目录,读写需要权限,不会随着应用卸载删除

    注意,内置存储中 /Android/data/packagenaem/ 路径的读写 Android 版本不同,需要权限不同,所以开发时应始终声明读写权限

    三、外置SD存储卡

    支持外置SD存储卡的机器,可以由 ContextCompat 的 getExternalFilesDirs() 方法得到所有存储根目录下 /Android/data/packagename/files 路径的数组,如果该方法第二个参数不为 null 则会再创建相应子级文件夹。再根据数组遍历,即可操作相应的存储路径进行读写。4.4及之后该操作不需要声明读写权限。
    File[] files = ContextCompat.getExternalFilesDirs(this, "");

    注意:

    1. 通过该方法得内置存储卡的路径,可以对根据 getParent 系列方法可以得到上一级的路径进行读写操作,但需要权限
    2. 通过该方法得外置SD存储卡的路径,但是不可以对根据 getpParent 系列方法得到的上级路径进行写,如果写会报没有权限异常,即使声明写权限也没用。声明读权限后可正常进行读操作。
    3. 内置和外置SD存储卡中 Android/data/packagename 目录,都会在应用程序详情中清除数据和应用卸载时被删除。

    相关文章

      网友评论

        本文标题:Android 文件存储

        本文链接:https://www.haomeiwen.com/subject/mjjxgttx.html