分区存储
在Android系统中,分区存储是一种用于管理应用程序数据的存储机制。它将设备的存储空间划分为不同的分区,每个分区都有不同的用途和访问权限。
Android分区存储从Android 10(API级别29)开始引入。在此版本之前,Android使用传统的外部存储和内部存储来管理应用程序的文件和数据。从Android 10开始,引入了一种新的存储模型,称为分区存储。
分区存储将应用程序的文件和数据分为两个主要类别:公共存储和私有存储。公共存储是可由多个应用程序访问的共享存储空间,例如照片、视频和音乐等媒体文件。私有存储是每个应用程序独立使用的存储空间,用于存储应用程序的私有文件和数据。
在分区存储模型下,应用程序默认只能访问其私有存储空间,而对于公共存储空间的访问需要进行特殊的权限申请。这样可以增强用户对文件和数据的隐私保护,并提高应用程序的安全性。
需要注意的是,虽然分区存储从Android 10开始引入,但在此之前的版本中仍然可以使用传统的外部存储和内部存储模型。因此,开发者需要根据目标设备的Android版本来选择合适的存储模型。
分区存储的背景是为了提高应用程序的安全性和隐私保护。通过将应用程序的私有数据存储在内部存储中,可以防止其他应用程序对这些数据的访问。而外部存储则提供了一个公共的存储空间,使得应用程序可以方便地共享数据。
总的来说,Android的分区存储机制为应用程序提供了灵活的存储方式,既保护了用户的隐私,又方便了数据的共享和传输。
分区存储目录
在Android 10中,引入了一种新的存储访问模式,称为分区存储。分区存储将应用的文件和数据存储在应用的私有目录中,以增强用户隐私和安全性。以下是Android 10分区存储目录的一些常见路径:
(1) 内部存储私有目录:/data/data/<package_name>/
这是应用的私有目录,只有应用本身可以访问。在这个目录下,应用可以存储私有文件、数据库、缓存等。
(2) 外部存储私有目录:/storage/emulated/0/Android/data/<package_name>/
这是应用的外部存储私有目录,只有应用本身可以访问。在这个目录下,应用可以存储私有文件、数据库、缓存等。
(3) 共享外部存储目录:/storage/emulated/0/
这是设备的共享外部存储目录,所有应用都可以访问。在这个目录下,应用可以存储共享文件、图片、音频、视频等。
需要注意的是,Android 10中的分区存储模式对于访问外部存储的权限有一些限制。应用需要在清单文件中声明相应的权限,并且需要动态请求用户授权才能访问外部存储。这样可以确保用户对于自己的数据有更好的控制权。
访问公共目录
在Android 10及更高版本中,访问公共目录需要使用MediaStore或者Storage Access Framework(SAF)来进行操作。SAF提供了一种标准的方式来访问设备上的公共文件,以增强用户的隐私和安全性。
1.MediaStore
使用「MediaStore」来访问公共数据。MediaStore是一个提供对多媒体文件(如图片、音频、视频)和其他文件(如文档)的访问的内容提供者。以下是使用MediaStore访问公共数据的步骤:
(1) 添加权限:在AndroidManifest.xml文件中添加以下权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
这将允许应用程序读取外部存储器上的媒体文件。
(2) 查询公共数据:使用ContentResolver查询MediaStore来获取公共数据。例如,要查询所有的图片,可以使用以下代码:
Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
String[] projection = {MediaStore.Images.Media._ID, MediaStore.Images.Media.DISPLAY_NAME};
String selection = null;
String[] selectionArgs = null;
String sortOrder = null;
Cursor cursor = getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder);
if (cursor != null && cursor.moveToFirst()) {
do {
// 处理每个图片的逻辑
String id = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media._ID));
String displayName = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME));
// ...
} while (cursor.moveToNext());
cursor.close();
}
这将返回一个包含图片的Cursor对象,然后可以遍历Cursor来处理每个图片的逻辑。
(3) 处理数据:根据需要处理查询到的数据。例如,可以使用图片的ID来获取其内容URI,并显示图片:
Uri imageUri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, Long.parseLong(id));
imageView.setImageURI(imageUri);
这将使用图片的内容URI来设置ImageView的图片。
根据需要,可以使用不同的MediaStore类来访问其他类型的公共数据,如音频、视频或文档。
2.SAF
以下是使用「SAF」访问公共数据的步骤:
(1) 请求访问权限:首先,你需要在应用的清单文件(AndroidManifest.xml)中声明适当的权限。例如,如果你想访问外部存储器上的公共目录,你需要添加以下权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
(2) 启动SAF:当你需要访问公共目录时,你可以使用Intent启动SAF。例如,如果你想让用户选择一个文件,你可以使用以下代码:
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
startActivityForResult(intent, REQUEST_CODE);
(3) 处理返回结果:当用户选择了一个文件后,你可以在onActivityResult方法中处理返回的结果。你可以通过data.getData()方法获取所选文件的URI。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
Uri uri = data.getData();
// 在这里处理所选文件的URI
}
}
通过以上步骤,你可以在Android 10及更高版本中访问公共目录。请注意,访问公共目录可能需要用户的授权,因此你应该在代码中处理授权请求和用户的选择。