AndroidManifest.xml
添加读写权限,使用
Environment.getExternalStorageDirectory()
获取路径。
Android 访问存储卡(即外部存储)通常涉及以下三种主要的目录:
1、外部存储公共目录 (Public External Storage)
获取方法:使用Environment.getExternalStoragePublicDirectory()
方法,传入一个类型参数如Environment.DIRECTORY_PICTURES
或Environment.DIRECTORY_MUSIC
等。
特点:适合保存用户希望长期保留并可以与其他应用共享的文件,如照片、音乐等,从 Android 10(API 级别 29)开始,如果要写入这些目录,则需要WRITE_EXTERNAL_STORAGE
权限,并且访问路径可能受到某些限制。
2、外部存储应用特定目录 (App-specific External Storage)
获取方法:通过调用Context.getExternalFilesDir()
方法获取,它可以传入一个类型参数,例如Context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)
,或者传入 null 来访问根目录。
特点:适合存储应用的临时缓存数据或不需要与其他应用共享的大型文件,不需要任何权限即可读写这些目录中的文件。
3、外部存储缓存目录 (External Cache Directory)
获取方法:通过调用Context.getExternalCacheDir()
来访问。
特点:适合存放应用运行过程中产生的临时缓存文件,系统可能在存储空间不足时删除这些缓存文件。
公共目录 | 应用特定目录和缓存目录 | |
权限 | 从 Android 4.4 开始,不需要权限就可以读取媒体文件,但 Android 10 及更高版本对文件写入做了限制。 | 不需要任何权限就可以进行读写操作。 |
数据持久性 | 文件通常被保留,直到用户手动删除它们。 | 当应用被卸载时,其中的文件会被自动删除。 |
共享性 | 文件可以被用户和其他应用访问。 | 虽然理论上其他应用也可以访问,但实际上主要是为当前应用服务的,其他应用通常不会去访问。 |
隐私性 | 由于所有应用都可以访问,所以隐私性较差。 | 相对私密,不易被其他应用访问。 |
存储策略 | 建议仅存储用户主动创建或明确希望与他人分享的文件。 | 适合存储应用的核心数据和不需共享的大型资源文件。 |
缓存目录 | 适合存储临时文件,应用必须能够处理这些文件被系统删除的情况。 |
Android 10(API 级别 29)以上的存储变更
从 Android 10(API 级别 29)开始,引入了分区存储(Scoped Storage),限制了对外部存储的全局访问,强制应用使用自己的应用特定目录,或通过 MediaStore API 访问共享文件类型,开发者在选择存储位置时,应该考虑到这些区别,并基于用户的数据隐私以及文件的用途选择正确的存储路径。
1、问题:如何在 Android 中动态申请存储权限?
解答:在 Android 6.0(API 23)及以上系统中,需要在运行时动态申请存储权限,首先检查是否已经获得了相应的权限,如果没有,则请求权限,使用ContextCompat.checkSelfPermission()
检查权限状态,如果未授予权限,则使用ActivityCompat.requestPermissions()
请求权限,在用户响应权限请求后,处理权限请求结果。
2、问题:为什么 Android 10 及以上版本需要添加android:requestLegacyExternalStorage="true"
属性?
解答:在 Android 10 及以上版本中,为了提高用户隐私和数据安全性,系统对外部存储的访问进行了更严格的限制,默认情况下,应用只能访问自己的私有目录,如果应用需要访问外部存储的公共目录或其他应用的目录,需要在AndroidManifest.xml
文件中的<application>
节点下添加android:requestLegacyExternalStorage="true"
属性,这样声明的应用将能够继续使用传统的外部存储访问方式,但这可能会在未来的版本中被移除或更改,因此建议开发者尽快迁移到新的存储机制。