您好,登录后才能下订单哦!
随着Android系统的不断演进,Google在Android 10(API级别29)中引入了分区存储(Scoped Storage)的概念。这一变化旨在改善用户隐私和数据安全,同时简化开发者的文件管理。分区存储的核心思想是将应用的文件访问权限限制在特定的范围内,从而减少应用对用户数据的滥用。
本文将详细介绍Android 10中分区存储的实现方式,包括其背景、工作原理、适配方法以及常见问题的解决方案。通过本文,开发者可以更好地理解如何在Android 10及更高版本中实现分区存储,并确保应用在未来的Android版本中保持兼容性。
在Android 10之前,应用可以通过READ_EXTERNAL_STORAGE
和WRITE_EXTERNAL_STORAGE
权限访问设备的整个外部存储空间。这种设计虽然方便了开发者,但也带来了严重的安全和隐私问题。恶意应用可以轻松访问用户的照片、视频、文档等敏感数据,甚至可以在用户不知情的情况下修改或删除这些文件。
为了解决这些问题,Google在Android 10中引入了分区存储机制。分区存储的主要目标包括:
分区存储的核心思想是将应用的文件访问权限限制在特定的范围内。具体来说,Android 10将外部存储空间分为以下几个部分:
/storage/emulated/0/Android/data/<package_name>
),用于存储应用私有的文件。这些文件只能由应用本身访问,其他应用无法访问。/storage/emulated/0
),除非应用具有特定的权限或用户明确授权。在Android 10中,每个应用都有一个专属的目录,用于存储应用私有的文件。这些文件只能由应用本身访问,其他应用无法访问。应用专属目录的路径为:
/storage/emulated/0/Android/data/<package_name>
开发者可以通过Context.getExternalFilesDir()
方法获取应用专属目录的路径。例如:
File externalFilesDir = getExternalFilesDir(null);
应用专属目录中的文件在应用卸载时会被自动删除,因此适合存储临时文件或应用私有的数据。
共享存储空间包括照片、视频、音频等媒体文件,以及下载、文档等公共文件。应用可以通过特定的API访问这些文件,但需要用户授权。
在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();
}
对于下载和文档文件,应用可以通过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
访问文件内容。
在Android 10中,应用无法直接访问外部存储的根目录(/storage/emulated/0
),除非应用具有特定的权限或用户明确授权。如果应用需要访问外部存储的根目录,可以通过以下方式实现:
MANAGE_EXTERNAL_STORAGE
权限:应用可以请求MANAGE_EXTERNAL_STORAGE
权限,以访问外部存储的根目录。该权限需要用户手动授权。Storage Access Framework (SAF)
:应用可以通过SAF请求用户授权访问特定的目录或文件。在Android 10中,分区存储默认是启用的。如果应用的目标SDK版本为Android 10(API级别29)或更高,系统会自动启用分区存储。如果应用需要禁用分区存储,可以在AndroidManifest.xml
中添加以下配置:
<application
android:requestLegacyExternalStorage="true"
... >
...
</application>
需要注意的是,从Android 11(API级别30)开始,requestLegacyExternalStorage
属性将不再生效,应用必须适配分区存储。
在适配分区存储时,开发者应优先使用应用专属目录存储应用私有的文件。应用专属目录的路径可以通过Context.getExternalFilesDir()
方法获取。例如:
File externalFilesDir = getExternalFilesDir(null);
应用专属目录中的文件在应用卸载时会被自动删除,因此适合存储临时文件或应用私有的数据。
对于共享存储空间中的文件,开发者应使用MediaStore
API或Storage Access Framework (SAF)
进行访问。以下是一些常见的适配场景:
在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();
}
对于下载和文档文件,应用可以通过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
访问文件内容。
如果应用需要访问外部存储的根目录,可以通过以下方式实现:
MANAGE_EXTERNAL_STORAGE
权限:应用可以请求MANAGE_EXTERNAL_STORAGE
权限,以访问外部存储的根目录。该权限需要用户手动授权。Storage Access Framework (SAF)
:应用可以通过SAF请求用户授权访问特定的目录或文件。在Android 10中,分区存储默认是启用的。如果应用的目标SDK版本为Android 10(API级别29)或更高,系统会自动启用分区存储。开发者可以通过以下代码判断分区存储是否启用:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
// 分区存储已启用
} else {
// 分区存储未启用
}
在分区存储中,应用无法直接访问外部存储的根目录。因此,开发者应避免使用硬编码的文件路径,而是使用MediaStore
API或Storage Access Framework (SAF)
访问文件。
在分区存储中,应用需要请求特定的权限才能访问共享存储空间中的文件。开发者应确保应用在访问文件时请求相应的权限,并处理用户拒绝授权的情况。
在分区存储中,应用通过URI访问文件。开发者应确保应用正确处理文件URI的变化,并在应用卸载或重新安装时保持文件的访问权限。
Android 10中的分区存储机制为开发者提供了更安全和高效的文件管理方式。通过限制应用对用户数据的访问,分区存储有效保护了用户隐私,同时简化了开发者的文件管理流程。
在适配分区存储时,开发者应优先使用应用专属目录存储应用私有的文件,并通过MediaStore
API或Storage Access Framework (SAF)
访问共享存储空间中的文件。此外,开发者还应注意处理文件路径、权限和URI的变化,以确保应用在未来的Android版本中保持兼容性。
通过本文的介绍,开发者可以更好地理解如何在Android 10及更高版本中实现分区存储,并确保应用在未来的Android版本中保持兼容性。希望本文能为开发者在适配分区存储时提供有价值的参考。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。