getFilesDir()与getExternalFilesDir()的区别

本文介绍了Android应用程序中的文件存储路径及管理方法,包括内部存储和外部存储的区别与使用方式,特别强调了图片等多媒体文件的存储策略及如何确保其他应用能够访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Android中文件存储路径包括内部存储和外部存储两种类型。

对于内部存储你可以使用这两个方法来获取相关路径:
getFilesDir()
getCacheDir(),存放app的临时缓存文件,记得不用时要删除这些文件,并且给这个文件设置一个合理的大小比如1M,因为如果系统内存紧张时,这些文件可能会在没有任何警告的情况下被删除.

对内部存储,当一个app被安装到手机后,Android系统会在内部存储的/data/data/目录下创建一个以包名称命名的文件夹。如果将图片保存在内部存储中,只能被应用自身读取,其他应用均无法读取。如果需要让系统图库,相册或其他应用能够找到保存的图片,必须将图片保存到外部存储中。

对外部存储,当一个app被安装到手机后,Android系统会在外部存储的/Android/data/目录下创建一个以包名命名的文件夹(这里第一个/不是根路径,而是相对外部存储所挂载路径的相对路径)。这个路径同样只能被应用自身读取,其他应用不能访问。因此,也不能将图片保存在这个目录中。如果只是应用本身访问可以通过这两个方法获取相关路径getExternalFilesDir(),getExternalCacheDir(),保存在这两个路径下的文件会随着应用的卸载而清空。

除外部存储的/Android目录之外的其他目录一般都是可以被其他应用访问的。目前,大多数应用都会在外部存储的根路径下建立一个类似包名的多层目录,以存储需要共享的文件。例如/storage/emulated/0/image/。还需要注意的是,很多查看图片的应用都支持按照文件夹来查看图片。如果将图片所在的文件夹取名为image,photo之类的,就无法和其他文件夹区分开,用户也不能识别该文件夹的用途。因此最好取一个有区分度的文件夹名字,例如百度贴吧就保存在/tieba目录,微信是保存在/tencent/MicroMsg/WeiXin目录。保存在这些路径的文件不会随着应用的卸载而清空
Android SDK中 Environment类 提供了getExternalStorageDirectory()方法来获取外部存储的根路径。示例如下:

String dir = Environment.getExternalStorageDirectory().getAbsolutePath() + "/tencent/MicroMsg/WeiXin/"

需要注意的是Environment.getExternalStorageDirectory()返回的路径中最后一个字符不是/,如果需要创建子目录,需要在子目录的前后都加上/。但是使用该路径之前首先要判断下是否已经挂在外部存储,代码如下

String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) { 
return true;//已经挂在外部存储 
} 
return false;//没有挂在外部存储

另外保存Environment.getExternalStorageDirectory()路径下的图片,还需要发送广播才能给图库访问到。
MediaScannerReceiver是一个广播接收者,当它接收到特定的广播请求后,就会去扫描指定的文件,并根据文件信息将其添加到数据库中。当图片文件被创建后,就可以发送广播给MediaScannerReceiver,通知其扫描新建的图片文件。示例如下。

try { 
File file = new File(dir + fileName + ".jpg"); 
FileOutputStream out = new FileOutputStream(file); 
mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
out.flush(); 
out.close(); 
//保存图片后发送广播通知更新数据库 
Uri uri = Uri.fromFile(file); 
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri));
} catch (Exception e) { 
e.printStackTrace(); 
} 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值