原文链接:http://my.oschina.net/liucundong/blog/314520
先介绍一下Android的存储
在 2.x 版本中,Android设备都是单存储,第三方App写文件,必须申请 WRITE_EXTERNAL_STORAGE 权限;
在4.0之后,Android设备开始有了内置闪存,即 primary storage,并且可以外置SD卡,即 secondary external storage device;
WRITE_EXTERNAL_STORAGE 权限变成了仅仅控制 primary storage,同时引入了 WRITE_MEDIA_STORAGE 权限来控制secondary external storage device的操作。
到了Android 4.4 KitKat,WRITE_MEDIA_STORAGE 权限仅提供给系统应用,不再授予第三方App。
关于 secondary external storage device 的写操作也有了新规定。
Android的文档是这么写的:
Link: http://source.android.com/devices/tech/storage/index.html:
The WRITE_EXTERNAL_STORAGE permission must only grant write access to
the primary external storage on a device. Apps must not be allowed to
write to secondary external storage devices, except in their
package-specific directories as allowed by synthesized permissions.
Restricting writes in this way ensures the system can clean up files
when applications are uninstalled.
翻译:
WRITE_EXTERNAL_STORAGE 权限,仅仅用于授权用户写 primary external storage,除了与自己包名相关的文件夹之外,应用程序不允许写secondary external storage devices。
举例来说,如果应用的包名是com.example.foo,那么外部存储上的Android/data/com.example.foo/文件夹就可随意访问,其他任何地方都不允许写,并且,存储在自己包名相关的文件夹的文件,当该应用被卸载时候也会随之被清除。
分情况来说:
只有外部存储的设备
这种设备一般是android4.0之前的,只有一个存储,不受这个规则限制,还是可以随便读写,但如果你刷了4.4系统,那么就只能写自己包名相关的文件夹了。只有内部存储的设备
比如Nexus系列,sony L系列,不受这个规则限制,但是建议在自己的包名相关的文件夹写数据。既有内部存储又有外部存储
需要遵守这个规定,不能在外部存储乱写了,需要在自己的包名相关的文件夹写数据。
Google做了这个限制后解决了这个问题:
随便一个App,都会在/sdcard、/sdcard1 上建一个目录,删了也会重新建,即使被卸载,也会留下一些垃圾文件。
但是,也产生了一个问题:
类似于视频、图像处理这种想在外部存储缓存大量音视频文件,并且App被卸载后还想保留的,就没办法了。
开发中应该怎么使用?
作为一个程序员,想必你也很讨厌App在SD卡根目录乱建目录吧,那就从我做起,来遵守Google的这一规定吧。
通过Context.getExternalFilesDir()方法可以获取到 SDCard/Android/data/{package_name}/files/ ,储存一些长时间保存的数据;
通过Context.getExternalCacheDir()方法可以获取到 SDCard/Android/data/{package_name}/cache/,储存临时缓存数据;
这两个目录分别对应 设置->应用->应用详情里面的”清除数据“与”清除缓存“选项。
一个获取外部存储Cache的例子:
/**
* 获取拓展存储Cache的绝对路径 * * @param context */ public static String getExternalCacheDir(Context context) { if (!isMounted()) return null; StringBuilder sb = new StringBuilder(); File file = context.getExternalCacheDir(); // In some case, even the sd card is mounted, // getExternalCacheDir will return null // may be it is nearly full. if (file != null) { sb.append(file.getAbsolutePath()).append(File.separator); } else { sb.append(Environment.getExternalStorageDirectory().getPath()).append("/Android/data/").append(context.getPackageName()) .append("/cache/").append(File.separator).toString(); } return sb.toString(); }
参考:
https://plus.google.com/+TodLiebeck/posts/gjnmuaDM8sn
http://blog.csdn.net/olevin/article/details/29575127
http://source.android.com/devices/tech/storage/index.html
相关推荐
在Android应用开发中,SD卡(Secure Digital Card)的使用是一项重要的存储管理技能。随着智能手机存储需求的增长,开发者经常需要利用SD卡来扩展应用程序的存储空间,存储用户数据、媒体文件或其他大型资源。本篇...
在安卓(Android)系统中,SD卡(Secure Digital Card)被广泛...通过对这个压缩包的学习,开发者可以深入了解Android系统的SD卡使用,提升应用的存储管理能力,确保在不同设备和Android版本上正确、高效地操作SD卡。
在Android开发中,SD卡(Secure Digital Card)的使用是一个重要的环节,特别是在处理大量数据、媒体文件或扩展应用程序存储时。本项目源码提供了一种实际应用中的示例,帮助开发者理解和掌握Android如何与外部存储...
在Android开发中,有时需要为模拟器或真实设备创建一个SD卡镜像,以扩展存储空间。创建SD卡镜像通常使用`mksdcard`命令,这是一个由Android SDK提供的工具。例如,创建一个大小为100MB的SD卡镜像,可以使用以下命令...
这个名为"Android应用源码之判断双SD卡_CheckDoubleSDCard.zip"的压缩包文件提供了一个示例代码,用于解决这样的问题。下面将详细解释相关知识点。 首先,Android系统中的外部存储分为两种类型:内部存储(Internal...
对于开发者而言,理解如何在SD卡上读写文件是开发Android应用时的一项基本技能,特别是对于需要进行数据备份的应用来说。本篇文章将深入探讨如何在Android上实现SD卡的文件读写操作,以及如何进行文件备份。 首先,...
1. **Android权限管理**:在Android系统中,访问外部存储(如SD卡)需要在`AndroidManifest.xml`文件中声明`READ_EXTERNAL_STORAGE`权限。例如: ```xml <uses-permission android:name="android.permission.READ_...
这个功能可以让用户自由选择存储在外部存储设备(如SD卡)上的音频文件进行播放,增加了应用的灵活性和用户体验。下面我们将详细讲解如何实现这个功能。 1. **访问SD卡** Android系统提供了`Environment`类来获取...
1. **系统内置功能**:部分Android版本提供了系统级的应用搬家功能,用户可以在设置中找到“应用管理”选项,选择需要搬家的应用并将其移动到SD卡上。 2. **第三方工具**:市面上有很多第三方应用,如“AppMgr III...
通过以上步骤,开发者可以在Android应用中轻松读取并处理内部存储的文本文件,而无需依赖SD卡。这不仅简化了代码,还避免了因SD卡不可用或权限问题导致的异常情况。在实际项目中,可以根据需求对这些步骤进行扩展和...
这个话题主要探讨如何在Android应用中检测并管理这些多张SD卡。Android的存储系统设计允许用户插入额外的microSD卡来扩展存储容量,这对于存储大量媒体文件或大型游戏数据的应用来说尤其重要。 首先,我们需要理解...
在安卓系统中,SD卡(Secure Digital Card)是设备扩展存储空间的重要方式,尤其是在设备内置存储有限的情况下。本文将深入探讨“安卓SD卡文件管理更新信息相关-判断双SD卡CheckDoubleSDCard.rar”这个主题,它涉及...
在Android系统中,虚拟SD卡(也称为内部存储扩展或 Adoptable Storage)是一种将设备的内部存储空间模拟为外部存储(通常称为SD卡)的方法。这种方法允许用户将内部存储视为可移动存储,从而提高数据管理和应用程序...
在Android系统中,SD卡(Secure Digital card)是设备扩展存储空间的重要部分,通常用于存储用户数据、应用程序、媒体文件等。当我们需要对SD卡进行管理或者查找特定文件时,就需要进行SD卡扫描。这个过程涉及到...
在Android系统中,SD卡是用户扩展存储空间的重要方式,用于存放应用程序、媒体文件和个人数据。然而,在刷入新系统后,有时会出现无法识别或找不到SD卡的问题,这可能是由于多种原因引起的。以下是一些可能的解决...
SD卡不仅用于存储照片和视频,还可以扩展设备的存储空间,用于安装应用程序、存储音乐和其他文件。学习资料可能涵盖了如何在各种设备上使用SD卡,如Android和iOS设备,以及如何优化其在不同设备上的性能。 总之,...
LINK2SD是一款专门为Android系统设计的应用程序,它允许用户将应用程序的数据和缓存文件移动到外部SD卡,而不是占用宝贵的内部存储空间。这款应用的核心功能包括: 1. **应用程序管理**:LINK2SD提供了方便的应用...
在Android系统中,SD卡(Secure Digital Memory Card)是设备扩展存储的重要部分,它用于存储用户数据、应用程序、媒体文件等。"07检查SD卡状态"这一主题聚焦于通过编程方式来检测SD卡是否可用、已挂载、剩余空间等...
通过学习这个基于Android 2.2的照相机Demo,开发者可以深入理解如何在Android应用中集成照相机功能,包括硬件权限管理、相机参数设置、预览和拍照的实现,以及资源的正确释放。这将为进行移动开发App的毕业设计或...