android 图片存储路径设置在哪里,Android 文件存储路径-内部/外部存储

android 图片存储路径设置在哪里,Android 文件存储路径-内部/外部存储

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

概述

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、最后通知图库更新;

保存图片注意存储权限设置

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版本一下系统,可以自定义设置保存路径。

项目地址

相关推荐

自己货车怎么找货源?货车司机找货源最好的平台
365体育亚洲官方入口app下载

自己货车怎么找货源?货车司机找货源最好的平台

📅 08-13 👁️ 888
Steam账号申诉客服回复时间解析
365体育亚洲官方入口app下载

Steam账号申诉客服回复时间解析

📅 06-28 👁️ 8169
Win11电脑桌面怎么设置?如何个性化定制?
365体育亚洲官方入口app下载

Win11电脑桌面怎么设置?如何个性化定制?

📅 08-04 👁️ 9182