美文网首页
Android 文件存储路径-内部/外部存储

Android 文件存储路径-内部/外部存储

作者: IT一书生 | 来源:发表于2019-06-22 17:58 被阅读0次

一、内存、内部存储、外部存储

概述
  • 4.4以下,机身存储就是内部存储,外部存储就是SD卡。我们通过getDataDirectory就可以获取内部存储根路径,通过getExternalStorageDirectory就可以获取外置SD卡根路径。
  • 4.4以上,机身存储包含内部存储和内置的外部存储,外部存储包含两部分内置的外部存储和SD卡,其中通过getExternalStorageDirectory获取的是内置的外部存储,而外置SD卡我们则需要通过getExternalDirs遍历来获取了。
  • 再看一张图
内存_内部存储_外部存储.png
区别
  • 内存
    内存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁。计算机中所有程序的运行都是在内存中进行的,所以说它是用于计算机运行时的,它不是用来存储数据的。
  • 内部存储
    存储于内部存储中的文件默认只能被你的应用访问到,且一个应用所创建的所有文件都在该应用包名的目录下。当一个应用卸载之后,内部存储中的这些文件也被删除。内部存储空间十分有限,它也是系统应用存储数据的地方,一旦内部存储使用完,手机也就卡的不行了,所以对于内部存储,尽量避免占用。SharedPreferences和SQLite数据库都是存储在内部存储空间上的。内部存储一般用Context来获取和操作。
    对于应用的自身文件允许外部访问,则将文件设置为可读,通过应用的包名可以访问到。要是不允许外部访问,则需要把文件设置为私有的,其他应用即使知道包名也无法访问。
内部存储路径.png
  • 外部存储
    4.4以下外部存储就是指外置的SD卡。
    4.4以上外部存储则包括内置的外部存储和外置的SD卡。
    4.4以上的系统中,API提供了这样一个方法来遍历手机的外部存储路径。如果有插入SD卡会打印两个条数据。否则只有第一条。
        // 遍历外部存储路径
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            File[] files = getExternalFilesDirs(Environment.MEDIA_MOUNTED);
            for (File file : files) {
                Log.e("zpan", file.getAbsolutePath());
            }
        }
/storage/emulated/0/Android/data/com.example.saveimage/files/mounted 
/storage/B3E4-1711/Android/data/com.example.saveimage/files/mounted

获取外部存储的方法:

E/zpan: Environment.getExternalStorageDirectory().getAbsolutePath()
E/zpan: /storage/emulated/0
E/zpan: Environment.getExternalStoragePublicDirectory("").getAbsolutePath()
E/zpan: /storage/emulated/0
E/zpan: getExternalFilesDir("").getAbsolutePath()
E/zpan: /storage/emulated/0/Android/data/com.example.saveimage/files
E/zpan: getExternalCacheDir().getAbsolutePath()
E/zpan: /storage/emulated/0/Android/data/com.example.saveimage/cache
  • 另外还有
image.png

注意:

  • 4.4以下版本getExternalFilesDir("")和getExternalCacheDir()返回的是null;4.4以上版本才返回以上结果。
  • 文件存放有三种路径:
    /data目录下的文件物理上存放在我们通常所说的内部存储里面
    /storage目录下的文件物理上存放在我们通常所说的外部存储里面
    /system用于存放系统文件,物理上它们也是存放在内部存储里面的

二、疑问

  • getFilesDir().getAbsolutePath()与getExternalFilesDir(").getAbsolutePath()区别
/data/user/0/com.example.saveimage/files 
/storage/emulated/0/Android/data/com.example.saveimage/files 

两者的区别是一个在内部存储里面,一个在外部存储里面。它们的共同点就是它们的路径都带有包名,表明是这个APP的专属文件,这类文件应该是随着app卸载而一起被删除的,并且我们在设置里面清除该应用的数据时,这两个文件夹下的数据都会被清除。

  • 清除数据与清除缓存的区别
    清除缓存:我们知道应用程序在运行过程中需要经过很多过程,比如读入程序,计算,输入输出等等,这些过程中肯定会产生很多的数据,它们在内存中,以供程序运行时调用。所以清除缓存清除的是APP运行过程中所产生的临时数据。
    清除数据:是清除应用包名下的数据包括内部存储和外部存储该应用包名下的files、cache等。

三、图片保存

先看段代码

    public void saveImageToAlbum(Bitmap bmp) {
        // 首先保存图片
        File cacheDir = getImageCacheDir();

        String fileName = System.currentTimeMillis() + ".jpg";
        File file = new File(cacheDir, fileName);
        try {
            FileOutputStream fos = new FileOutputStream(file);
            bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos);
            fos.flush();
            fos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            Toast.makeText(this, "FileNotFoundException", Toast.LENGTH_SHORT).show();
        } catch (IOException e) {
            e.printStackTrace();
            Toast.makeText(this, "IOException", Toast.LENGTH_SHORT).show();
        }

        // 其次把文件插入到系统图库
        try {
            MediaStore.Images.Media.insertImage(getContentResolver(), file.getAbsolutePath(), fileName, null);
            Toast.makeText(this, "保存成功", Toast.LENGTH_SHORT).show();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        // 最后通知图库更新
        sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(cacheDir)));
    }

    /**
     * 图片保存路径
     */
    public File getImageCacheDir() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            return getExternalFilesDir("");
        }
        return createFile(Environment.getExternalStorageDirectory().getAbsolutePath(), "zpan");
    }

    public File createFile(String folderPath, String fileName) {
        File destDir = new File(folderPath, fileName);
        if (!destDir.exists()) {
            destDir.mkdirs();
        }
        return destDir;
    }
  • 保存图片分三个步骤:
    1、首先设置图片保存地址;
    2、其次把文件插入到系统图库
    3、最后通知图库更新;
  • 保存图片注意存储权限设置
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

6.0版本以上系统还要做权限的动态配置,如下:

// 申请权限
String[] mPermissionList = new String[] {
       Manifest.permission.WRITE_EXTERNAL_STORAGE, 
       Manifest.permission.READ_EXTERNAL_STORAGE
 };
ActivityCompat.requestPermissions(MainActivity.this, mPermissionList, 100);
    // 申请回执
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case 100:
                boolean writeExternalStorage = grantResults[0] == PackageManager.PERMISSION_GRANTED;
                boolean readExternalStorage = grantResults[1] == PackageManager.PERMISSION_GRANTED;
                if (grantResults.length > 0 && writeExternalStorage && readExternalStorage) {
                    saveImageToAlbum(saveBitmap);
                } else {
                    Toast.makeText(this, "请设置存储权限", Toast.LENGTH_SHORT).show();
                }
                break;
            default:
                break;
        }
    }
  • 注意:数据保存一般优先保存在应用的外部存储,方便资源管理;要是遇到4.4版本一下系统,可以自定义设置保存路径。

项目地址

feat-saveimage

相关文章

  • android存储

    Android中的存储 参考 彻底搞懂Android文件存储---内部存储,外部存储以及各种存储路径解惑[http...

  • Android存储及路径

    Android存储及路径 Android手机存储分类 分为:内部存储和外部存储 如何区分内部存储和外部存储:可以从...

  • Android storage

    Android存储结构android中的文件操作详解以及内部存储和外部存储彻底理解android中的内部存储与外部...

  • Android 文件存储路径-内部/外部存储

    一、内存、内部存储、外部存储 概述 4.4以下,机身存储就是内部存储,外部存储就是SD卡。我们通过getDataD...

  • Android存储路径

    Android 存储路径分为内部存储和外部存储 1.内部存储的主要方式 对应的分别时的路径分别是: /data /...

  • Android 与文件相关的知识

    文章出自:android中的文件操作详解以及内部存储和外部存储 内部存储(internal storage) 内部...

  • 安卓获取文件夹路径

    目的:获取sd卡根目录下的文件夹 推荐一篇关于安卓路径的文章彻底搞懂Android文件存储---内部存储,外部存储...

  • Android数据存储

    (一)文件存储分类: 获取文件路径:内部路径和外部路径如下: 文件写操作如下: 文件读操作如下: 文件存储在设备上...

  • 010.Android中的存储文件目录

    参考文件:彻底了解android中的内部存储与外部存储Android中关于内部存储的一些重要函数

  • Android 内部存储和外部存储

    Android 存储可如下划分: 内部RAM 内部存储:内部ROM 外部存储:外部ROM和Sdcard 内部存储 ...

网友评论

      本文标题:Android 文件存储路径-内部/外部存储

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