当前位置:首页 > 行业动态 > 正文

Android存储卡访问权限详解,如何获取与操作?

在Android中访问存储卡,需在 AndroidManifest.xml添加读写权限,使用 Environment.getExternalStorageDirectory()获取路径。

Android访问存储卡

Android 访问存储卡(即外部存储)通常涉及以下三种主要的目录:

1、外部存储公共目录 (Public External Storage)

获取方法:使用Environment.getExternalStoragePublicDirectory() 方法,传入一个类型参数如Environment.DIRECTORY_PICTURESEnvironment.DIRECTORY_MUSIC 等。

特点:适合保存用户希望长期保留并可以与其他应用共享的文件,如照片、音乐等,从 Android 10(API 级别 29)开始,如果要写入这些目录,则需要WRITE_EXTERNAL_STORAGE 权限,并且访问路径可能受到某些限制。

2、外部存储应用特定目录 (App-specific External Storage)

Android存储卡访问权限详解,如何获取与操作?

获取方法:通过调用Context.getExternalFilesDir() 方法获取,它可以传入一个类型参数,例如Context.getExternalFilesDir(Environment.DIRECTORY_PICTURES),或者传入 null 来访问根目录。

特点:适合存储应用的临时缓存数据或不需要与其他应用共享的大型文件,不需要任何权限即可读写这些目录中的文件。

3、外部存储缓存目录 (External Cache Directory)

获取方法:通过调用Context.getExternalCacheDir() 来访问。

Android存储卡访问权限详解,如何获取与操作?

特点:适合存放应用运行过程中产生的临时缓存文件,系统可能在存储空间不足时删除这些缓存文件。

使用方面的区别

公共目录 应用特定目录和缓存目录
权限 从 Android 4.4 开始,不需要权限就可以读取媒体文件,但 Android 10 及更高版本对文件写入做了限制。 不需要任何权限就可以进行读写操作。
数据持久性 文件通常被保留,直到用户手动删除它们。 当应用被卸载时,其中的文件会被自动删除。
共享性 文件可以被用户和其他应用访问。 虽然理论上其他应用也可以访问,但实际上主要是为当前应用服务的,其他应用通常不会去访问。
隐私性 由于所有应用都可以访问,所以隐私性较差。 相对私密,不易被其他应用访问。
存储策略 建议仅存储用户主动创建或明确希望与他人分享的文件。 适合存储应用的核心数据和不需共享的大型资源文件。
缓存目录 适合存储临时文件,应用必须能够处理这些文件被系统删除的情况。

Android 10(API 级别 29)以上的存储变更

从 Android 10(API 级别 29)开始,引入了分区存储(Scoped Storage),限制了对外部存储的全局访问,强制应用使用自己的应用特定目录,或通过 MediaStore API 访问共享文件类型,开发者在选择存储位置时,应该考虑到这些区别,并基于用户的数据隐私以及文件的用途选择正确的存储路径。

相关问题与解答

1、问题:如何在 Android 中动态申请存储权限?

Android存储卡访问权限详解,如何获取与操作?

解答:在 Android 6.0(API 23)及以上系统中,需要在运行时动态申请存储权限,首先检查是否已经获得了相应的权限,如果没有,则请求权限,使用ContextCompat.checkSelfPermission() 检查权限状态,如果未授予权限,则使用ActivityCompat.requestPermissions() 请求权限,在用户响应权限请求后,处理权限请求结果。

2、问题:为什么 Android 10 及以上版本需要添加android:requestLegacyExternalStorage="true" 属性?

解答:在 Android 10 及以上版本中,为了提高用户隐私和数据安全性,系统对外部存储的访问进行了更严格的限制,默认情况下,应用只能访问自己的私有目录,如果应用需要访问外部存储的公共目录或其他应用的目录,需要在AndroidManifest.xml 文件中的<application> 节点下添加android:requestLegacyExternalStorage="true" 属性,这样声明的应用将能够继续使用传统的外部存储访问方式,但这可能会在未来的版本中被移除或更改,因此建议开发者尽快迁移到新的存储机制。