Android 10中怎么实现分区存储

发布时间:2021-06-26 14:47:10 作者:Leah
来源:亿速云 阅读:383

Android 10中怎么实现分区存储

引言

随着Android系统的不断演进,Google在Android 10(API级别29)中引入了分区存储(Scoped Storage)的概念。这一变化旨在改善用户隐私和数据安全,同时简化开发者的文件管理。分区存储的核心思想是将应用的文件访问权限限制在特定的范围内,从而减少应用对用户数据的滥用。

本文将详细介绍Android 10中分区存储的实现方式,包括其背景、工作原理、适配方法以及常见问题的解决方案。通过本文,开发者可以更好地理解如何在Android 10及更高版本中实现分区存储,并确保应用在未来的Android版本中保持兼容性。

1. 分区存储的背景

1.1 为什么需要分区存储?

在Android 10之前,应用可以通过READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE权限访问设备的整个外部存储空间。这种设计虽然方便了开发者,但也带来了严重的安全和隐私问题。恶意应用可以轻松访问用户的照片、视频、文档等敏感数据,甚至可以在用户不知情的情况下修改或删除这些文件。

为了解决这些问题,Google在Android 10中引入了分区存储机制。分区存储的主要目标包括:

1.2 分区存储的核心概念

分区存储的核心思想是将应用的文件访问权限限制在特定的范围内。具体来说,Android 10将外部存储空间分为以下几个部分:

2. 分区存储的工作原理

2.1 应用专属目录

在Android 10中,每个应用都有一个专属的目录,用于存储应用私有的文件。这些文件只能由应用本身访问,其他应用无法访问。应用专属目录的路径为:

/storage/emulated/0/Android/data/<package_name>

开发者可以通过Context.getExternalFilesDir()方法获取应用专属目录的路径。例如:

File externalFilesDir = getExternalFilesDir(null);

应用专属目录中的文件在应用卸载时会被自动删除,因此适合存储临时文件或应用私有的数据。

2.2 共享存储空间

共享存储空间包括照片、视频、音频等媒体文件,以及下载、文档等公共文件。应用可以通过特定的API访问这些文件,但需要用户授权。

2.2.1 访问媒体文件

在Android 10中,应用可以通过MediaStore API访问共享存储空间中的媒体文件。MediaStore提供了对照片、视频、音频等文件的访问接口。例如,查询所有照片的代码如下:

ContentResolver resolver = getContentResolver();
Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
Cursor cursor = resolver.query(uri, null, null, null, null);
if (cursor != null) {
    while (cursor.moveToNext()) {
        String displayName = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME));
        // 处理照片文件
    }
    cursor.close();
}

2.2.2 访问下载和文档文件

对于下载和文档文件,应用可以通过Storage Access Framework (SAF)访问。SAF提供了一个文件选择器界面,用户可以选择特定的文件或目录进行访问。例如,打开文件选择器的代码如下:

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
startActivityForResult(intent, REQUEST_CODE_OPEN_DOCUMENT);

onActivityResult()方法中,应用可以获取用户选择的文件URI,并通过ContentResolver访问文件内容。

2.3 外部存储根目录

在Android 10中,应用无法直接访问外部存储的根目录(/storage/emulated/0),除非应用具有特定的权限或用户明确授权。如果应用需要访问外部存储的根目录,可以通过以下方式实现:

3. 适配分区存储

3.1 启用分区存储

在Android 10中,分区存储默认是启用的。如果应用的目标SDK版本为Android 10(API级别29)或更高,系统会自动启用分区存储。如果应用需要禁用分区存储,可以在AndroidManifest.xml中添加以下配置:

<application
    android:requestLegacyExternalStorage="true"
    ... >
    ...
</application>

需要注意的是,从Android 11(API级别30)开始,requestLegacyExternalStorage属性将不再生效,应用必须适配分区存储。

3.2 适配应用专属目录

在适配分区存储时,开发者应优先使用应用专属目录存储应用私有的文件。应用专属目录的路径可以通过Context.getExternalFilesDir()方法获取。例如:

File externalFilesDir = getExternalFilesDir(null);

应用专属目录中的文件在应用卸载时会被自动删除,因此适合存储临时文件或应用私有的数据。

3.3 适配共享存储空间

对于共享存储空间中的文件,开发者应使用MediaStore API或Storage Access Framework (SAF)进行访问。以下是一些常见的适配场景:

3.3.1 访问媒体文件

在Android 10中,应用可以通过MediaStore API访问共享存储空间中的媒体文件。例如,查询所有照片的代码如下:

ContentResolver resolver = getContentResolver();
Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
Cursor cursor = resolver.query(uri, null, null, null, null);
if (cursor != null) {
    while (cursor.moveToNext()) {
        String displayName = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME));
        // 处理照片文件
    }
    cursor.close();
}

3.3.2 访问下载和文档文件

对于下载和文档文件,应用可以通过Storage Access Framework (SAF)访问。例如,打开文件选择器的代码如下:

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
startActivityForResult(intent, REQUEST_CODE_OPEN_DOCUMENT);

onActivityResult()方法中,应用可以获取用户选择的文件URI,并通过ContentResolver访问文件内容。

3.4 适配外部存储根目录

如果应用需要访问外部存储的根目录,可以通过以下方式实现:

4. 常见问题与解决方案

4.1 如何判断分区存储是否启用?

在Android 10中,分区存储默认是启用的。如果应用的目标SDK版本为Android 10(API级别29)或更高,系统会自动启用分区存储。开发者可以通过以下代码判断分区存储是否启用:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    // 分区存储已启用
} else {
    // 分区存储未启用
}

4.2 如何处理文件路径的变化?

在分区存储中,应用无法直接访问外部存储的根目录。因此,开发者应避免使用硬编码的文件路径,而是使用MediaStore API或Storage Access Framework (SAF)访问文件。

4.3 如何处理文件权限的变化?

在分区存储中,应用需要请求特定的权限才能访问共享存储空间中的文件。开发者应确保应用在访问文件时请求相应的权限,并处理用户拒绝授权的情况。

4.4 如何处理文件URI的变化?

在分区存储中,应用通过URI访问文件。开发者应确保应用正确处理文件URI的变化,并在应用卸载或重新安装时保持文件的访问权限。

5. 总结

Android 10中的分区存储机制为开发者提供了更安全和高效的文件管理方式。通过限制应用对用户数据的访问,分区存储有效保护了用户隐私,同时简化了开发者的文件管理流程。

在适配分区存储时,开发者应优先使用应用专属目录存储应用私有的文件,并通过MediaStore API或Storage Access Framework (SAF)访问共享存储空间中的文件。此外,开发者还应注意处理文件路径、权限和URI的变化,以确保应用在未来的Android版本中保持兼容性。

通过本文的介绍,开发者可以更好地理解如何在Android 10及更高版本中实现分区存储,并确保应用在未来的Android版本中保持兼容性。希望本文能为开发者在适配分区存储时提供有价值的参考。

推荐阅读:
  1. 作为Android开发者 你真的知道Android按下开机键到启动发生什么吗?
  2. Android内核开发:系统分区与镜像文件的烧写

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

android

上一篇:如何用 .gitignore忽略Git仓库中的文件

下一篇:nacos中RaftPeerSet的原理和作用是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》